1. Objective C / Говнокод #12901

    −81

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    @implementation CheckButton
    @synthesize isChecked;
    -(id) initWithFrame:(CGRect)frame
    {
    	if (self = [super initWithFrame:frame])
    	{
    		[self addTarget:self action:@selector(checkBoxClicked:) forControlEvents:UIControlEventTouchUpInside];
    	}
    	return self;
    }
    -(void) setState:(BOOL)checked
    {
    	if (self.tag == 1)
    	{
    		if (checked)
    		{
    			[self setImage:[UIImage imageNamed: @"simple_act.png"] forState:UIControlStateNormal];
    		}
    		else
    		{
    			[self setImage:[UIImage imageNamed: @"simple_noact.png"] forState:UIControlStateNormal];
    		}
    	}
    	else
    		if (self.tag == 2)
    		{
    			if (checked)
    			{
    				[self setImage:[UIImage imageNamed: @"pro_act.png"] forState:UIControlStateNormal];
    			}
    			else
    			{
    				[self setImage:[UIImage imageNamed: @"pro_noact.png"] forState:UIControlStateNormal];
    			}
    		}
    		else
    			if (self.tag == 3)
    			{
    				if (checked)
    				{
    					[self setImage:[UIImage imageNamed: @"all_act.png"] forState:UIControlStateNormal];
    				}
    				else
    				{
    					[self setImage:[UIImage imageNamed: @"all_noact.png"] forState:UIControlStateNormal];
    				}
    			}
    	isChecked = checked;
    }
    -(void) checkBoxClicked:(id)sender
    {
    	if (self.isChecked)
    		return;	
    	if (self.tag == 1)
    	{
    		if (self.isChecked)
    		{
    			[self setImage:[UIImage imageNamed: @"simple_noact.png"] forState:UIControlStateNormal];
    		}
    		else
    		{
    			[self setImage:[UIImage imageNamed: @"simple_act.png"] forState:UIControlStateNormal];
    		}
    	}
    	else
    		if (self.tag == 2)
    		{
    			if (self.isChecked)
    			{
    				[self setImage:[UIImage imageNamed: @"pro_noact.png"] forState:UIControlStateNormal];
    			}
    			else
    			{
    				[self setImage:[UIImage imageNamed: @"pro_act.png"] forState:UIControlStateNormal];
    			}
    		}
    		else
    			if (self.tag == 3)
    			{
    				if (self.isChecked)
    				{
    					[self setImage:[UIImage imageNamed: @"all_noact.png"] forState:UIControlStateNormal];
    				}
    				else
    				{
    					[self setImage:[UIImage imageNamed: @"all_act.png"] forState:UIControlStateNormal];
    				}
    			}
    	isChecked = !isChecked;
    }

    Подклассим UIButton для того, чтобы в зависимости от состояния выделенности кнопки менять ей image.

    Запостил: QuickNick, 16 Апреля 2013

    Комментарии (5) RSS

    • А что никак не задать свойствами checked/unchecked image?
      Ответить
      • http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIControl_Class/Reference/Reference.html#//apple_ref/c/econst/UIControlStateNormal

        Вообще, можно и нужно поставить 1 image на Normal-состояние и 1 image на Selected. Возможно, продублировать их на Highlighted и Highlighted|Selected.

        Альтернатива коду выше:
        UIButton *button = ...
        UIImage *normalImage = ...
        UIImage *selectedImage = ...
        [button setImage: normalImage forState: UIControlStateNormal];
        [button setImage: normalImage forState: UIControlStateHighlighted];
        [button setImage: selectedImage forState: UIControlStateSelected];
        [button setImage: selectedImage forState: UIControlStateSelected | UIControlStateHighlighted];
        Ответить
    • А как это работает?
      if (self.isChecked)
      		return;	
      	if (self.tag == 1)
      	{
      		if (self.isChecked) //...
      Ответить
      • Снаружи ему дергают setState: (BOOL) checked

        Логика такая: есть 3 кнопки A, B, C.
        Когда жмакают на невыделенную кнопку, она перетягивает выделение на себя, а с остальных выделение снимается. А когда жмут на выделенную кнопку, то выделение с нее сняться не может.
        Ответить
      • По-видимому, изначально
        if (self.isChecked)
        	return;

        не было, а появилось в результате фикса. Программирование у этого товарища шло следующим образом:
        1)Получить задачу. В лобовую ее решать, перебирая все возможные комбинации событий.
        2)На тестировании узнать, что не покрыл какую-то комбинацию и добавить ее.
        3)При расширении функционала сделать так:
        if (newCondition)
        {
          // новый говнокод
          return;
        }
        else
        {
         //перетащить сюда старый код.
        }
        Ответить

    Добавить комментарий