| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 | ////  RadioButton.m////  Created by Sergey Nikitenko on 3/5/13.//  Copyright 2013 Sergey Nikitenko. All rights reserved.////  Permission is hereby granted, free of charge, to any person obtaining a copy//  of this software and associated documentation files (the "Software"), to deal//  in the Software without restriction, including without limitation the rights//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell//  copies of the Software, and to permit persons to whom the Software is//  furnished to do so, subject to the following conditions:////  The above copyright notice and this permission notice shall be included in//  all copies or substantial portions of the Software.////  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN//  THE SOFTWARE.//#import "RadioButton.h"@interface RadioButton(){	NSMutableArray* _sharedLinks;}@end@implementation RadioButton- (id)initWithFrame:(CGRect)frame{    self = [super initWithFrame:frame];    if (self) {		if(![[self allTargets] containsObject:self]) {			[super addTarget:self action:@selector(onTouchUpInside) forControlEvents:UIControlEventTouchUpInside];		}    }    return self;}-(void) awakeFromNib{	if(![[self allTargets] containsObject:self]) {		[super addTarget:self action:@selector(onTouchUpInside) forControlEvents:UIControlEventTouchUpInside];	}}-(void) addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents{	// 'self' should be the first target	if(![[self allTargets] containsObject:self]) {		[super addTarget:self action:@selector(onTouchUpInside) forControlEvents:UIControlEventTouchUpInside];	}	[super addTarget:target action:action forControlEvents:controlEvents];}-(void) onTouchUpInside{	[self setSelected:YES distinct:YES sendControlEvent:YES];}-(void) setGroupButtons:(NSArray *)buttons{	if(!_sharedLinks) {		for(RadioButton* rb in buttons) {			if(rb->_sharedLinks) {				_sharedLinks = rb->_sharedLinks;				break;			}		}		if(!_sharedLinks) {			_sharedLinks = [[NSMutableArray alloc] initWithCapacity:[buttons count]+1];		}	}	BOOL (^btnExistsInList)(NSArray*, RadioButton*) = ^(NSArray* list, RadioButton* rb){		for(NSValue* v in list) {			if([v nonretainedObjectValue]==rb) {				return YES;			}		}		return NO;	};	if(!btnExistsInList(_sharedLinks, self)) {		[_sharedLinks addObject:[NSValue valueWithNonretainedObject:self]];	}	for(RadioButton* rb in buttons) {		if(rb->_sharedLinks!=_sharedLinks) {			if(!rb->_sharedLinks) {				rb->_sharedLinks = _sharedLinks;			} else {				for(NSValue* v in rb->_sharedLinks) {					RadioButton* vrb = [v nonretainedObjectValue];					if(!btnExistsInList(_sharedLinks, vrb)) {						[_sharedLinks addObject:v];						vrb->_sharedLinks = _sharedLinks;					}				}			}		}		if(!btnExistsInList(_sharedLinks, rb)) {			[_sharedLinks addObject:[NSValue valueWithNonretainedObject:rb]];		}	}}-(NSArray*) groupButtons{	if([_sharedLinks count]) {		NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:[_sharedLinks count]];		for(NSValue* v in _sharedLinks) {			[buttons addObject:[v nonretainedObjectValue]];		}		return buttons;	}	return nil;}-(RadioButton*) selectedButton{	if([self isSelected]) {		return self;	} else {		for(NSValue* v in _sharedLinks) {			RadioButton* rb = [v nonretainedObjectValue];			if([rb isSelected]) {				return rb;			}		}	}	return nil;}-(void) setSelected:(BOOL)selected{	[self setSelected:selected distinct:YES sendControlEvent:NO];}-(void) setButtonSelected:(BOOL)selected sendControlEvent:(BOOL)sendControlEvent{	BOOL valueChanged = (self.selected != selected);	[super setSelected:selected];	if(valueChanged && sendControlEvent) {		[self sendActionsForControlEvents:UIControlEventValueChanged];	}}-(void) setSelected:(BOOL)selected distinct:(BOOL)distinct sendControlEvent:(BOOL)sendControlEvent{	[self setButtonSelected:selected sendControlEvent:sendControlEvent];	if( distinct && (selected || [_sharedLinks count]==2) )	{		selected = !selected;		for(NSValue* v in _sharedLinks) {			RadioButton* rb = [v nonretainedObjectValue];			if(rb!=self) {				[rb setButtonSelected:selected sendControlEvent:sendControlEvent];			}		}	}}-(void) deselectAllButtons{	for(NSValue* v in _sharedLinks) {		RadioButton* rb = [v nonretainedObjectValue];		[rb setButtonSelected:NO sendControlEvent:NO];	}}-(void) setSelectedWithTag:(NSInteger)tag{	if(self.tag == tag) {		[self setSelected:YES distinct:YES sendControlEvent:NO];	} else {		for(NSValue* v in _sharedLinks) {			RadioButton* rb = [v nonretainedObjectValue];			if(rb.tag == tag) {				[rb setSelected:YES distinct:YES sendControlEvent:NO];				break;			}		}	}}- (void)dealloc{	for(NSValue* v in _sharedLinks) {		if([v nonretainedObjectValue]==self) {			[_sharedLinks removeObjectIdenticalTo:v];			break;		}	}}@end
 |