2015-10-25 4 views
1

Допустим, у вас есть калькулятор, который вы строите для iOS в Swift. Когда пользователь удаляет операцию (деление, сложение, вычитание и т. Д.), Я хотел бы избежать использования отдельного метода для обработки каждого из них.Swift/iOS - UIButton Sender с дополнительной информацией

Вместо этого, я предпочел бы иметь завод, который, основываясь на отправителе, определяет правильный OperationType подкласс использовать (вычитание, умножение и т.д.)

Мой вопрос: является ли это правильная практика хранить информацию непосредственно на кнопке пользовательского интерфейса в Xcode? Например, на кнопке Addition (+), если я пометил ее Addition, я мог бы затем использовать эту информацию для загрузки класса Addition.

Аналогично, для каждой цифры я предпочитаю иметь одну функцию, которая обрабатывает пользователя, нажимающего любую цифру. Однако, чтобы определить отправителя, кажется немного неаккуратным использовать sender.title, так как он связывает визуальный заголовок цифры с кодом. Должно ли тогда предоставить tags, чтобы справиться с этим, или есть ли другая система обработки этого?

ответ

1

Вы можете, конечно, сделать это, и иногда это делает для чистого дизайна. Просмотреть объекты имеют свойство тега (Int.). Вы можете поместить оператор switch в свой метод (ы) действия, который включает значение тега. Как правило, вы должны использовать значения тегов, начиная с 1 или более, так как значение 0 по умолчанию равно.

Если вам нужно больше целочисленного значения, вы можете либо сохранить свои значения в массиве, в который вы индексируете значение тега, либо использовать ассоциативное хранилище для фактического хранения объектов, прикрепленных к вашим кнопкам. Проведите поиск по «Связанным с какао объектам» для получения дополнительной информации об этой технике. Или вы можете посмотреть демонстрационный проект, который я поставил на github: https://github.com/DuncanMC/AssocitiveStorageDemo (Написано в Objective-C, но техника такая же в Swift)

1
override func viewDidLoad() { 
    super.viewDidLoad() 


    let button1 = UIButton(frame: CGRect(x: 0, y: 0, width: 200, height: 200)); 
    let button2 = UIButton(frame: CGRect(x: 0, y: 250, width: 200, height: 200)); 
    button1.backgroundColor = UIColor.greenColor(); 
    button2.backgroundColor = UIColor.yellowColor(); 
    button1.addTarget(self, action: "buttonTaped:", forControlEvents: .TouchUpInside); 
    button2.addTarget(self, action: "buttonTaped:", forControlEvents: .TouchUpInside); 

    button1.tag = 0; 
    button2.tag = 1; 

    self.view.addSubview(button1); 
    self.view.addSubview(button2); 

} 

    func buttonTaped(button:UIButton){ 
     switch(button.tag){ 
     case 0: 
      print("button 1 taped"); 
      break; 
     case 1: 
      print("button 2 taped"); 
      break; 
     default: 
      break; 
     } 
    } 
0

Вы можете использовать свойство тег

func buttonClicked(sender:AnyObject) { 

    let button = sender as! UIButton 

    if button.tag == 0 { 
     ... 
    } 
    else if button.tag == 1 { 
     ... 
    } 
} 
Смежные вопросы