2015-07-31 2 views
0

Xcode 6, Свифта, iOS8performSegueWithIdentifier не работает для программно генерируемых UIButtons (IOS/Swift)

У меня есть контроллер представления, который заполняется с помощью динамически генерируемых UIButtons. Количество кнопок зависит от фида данных и не является статичным. Я подсчитываю количество объектов в фиде и генерирую кнопку для каждого объекта. Предполагается, что каждая кнопка перейдет в представление деталей, которое отображает информацию для соответствующего объекта.

В интерфейсе Builder я создал сеанс между двумя контроллерами просмотра и назвал его. Я не добавил IBAction, чтобы инициировать сеанс, поскольку я не могу привязать его к определенной кнопке.

Внутри класса View Controller я выполнить следующее:

@IBOutlet weak var localScrollView: UIScrollView! 


override func viewDidLoad() { 
    super.viewDidLoad() 

//Define the button dimensions 
    let buttonWidth:CGFloat = 200 
    let buttonHeight:CGFloat = 113 

    var xPos:CGFloat = 0 
    var scrollViewContent:CGFloat = 0 
    var thumbURL:String 

//keeps track of the number of videos. The count is used to set a tag on the button to help identify it. 
    var vidCount:Int = 0 

    //loop through the array of recommended video objects 
    for index in recommended{ 

    //Create a button for each object 
     var myButton = UIButton.buttonWithType(UIButtonType.System) as! UIButton 

     myButton.frame = CGRectMake(xPos, 0.0, buttonWidth, buttonHeight) 

    //For the button action I call the handleTap function detailed below 
     myButton.addTarget(self, action: "handleTap:", forControlEvents: .TouchUpInside) 

     myButton.tag = vidCount 

    //The image for the button is pulled from a CDN. This code sets the image in the button. 
     let curVal = index.thumbURL 
     if let url = NSURL(string: curVal) { 
      if let data = NSData(contentsOfURL: url){ 

       myButton.setBackgroundImage(UIImage(data:data), forState: UIControlState.Normal) 

      } 
     } 

    //add the button to the scroll view 
     localScrollView.addSubview(myButton) 

     let spacer:CGFloat = 10 
     xPos+=buttonWidth + spacer 
     scrollViewContent += buttonWidth + spacer 

     localScrollView.contentSize = CGSize(width: scrollViewContent, height: buttonHeight) 
     vidCount += 1 

    } 


} 


//function to handle the tap action 
func handleTap(sender:UIButton){ 

    //Set the variable that will be passed to the next view controller 
    curRecVid = recommended[sender.tag] 

    //initiate the segue 
    dispatch_async(dispatch_get_main_queue()) { 
     self.performSegueWithIdentifier("toSingle", sender: self) 
    } 

} 

//prepare the data to be transferred to the next view controller 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if (segue.identifier == "toSingle") { 
     var targetViewController = segue.destinationViewController as! SingleViewController 
     targetViewController.targetVid = curRecVid 

    } 
} 

}

Когда я запустить приложение в симуляторе, он попадает в self.performSegueWithIdentifier ("toSingle", отправитель: самостоятельно), а затем завершается до следующего неперехваченного исключения: «NSInvalidArgumentException», причина: '- [UILabel copyWithZone:]: непризнанный селектор, отправленный в экземпляр 0x7fd468c8ddc0'

Любая помощь, помогающая выявить причину этого исключения w следует приветствовать.

+1

Я предполагаю, что проблема заключается не в этом контроллере, а в контроллере представления этого сегмента, поэтому вы можете снова проверить его код. –

+0

вам нужно снова проверить имя segue – Lamar

+0

В настоящее время я не вижу ошибок в целевом контроллере View. Прямо сейчас это довольно урезано. Просто имейте переменную, чтобы поймать пройденный объект, но я ничего с этим не делаю, потому что еще не получил этого еще. Я даже попытался удалить передаваемые данные и просто попытался открыть новое представление. –

ответ

0

Похоже, что файл класса для целевого контроллера просмотра имел какую-то проблему. После комментария от Epic Defeater, я уничтожил его быстрый файл, повторно сгенерировал его и поставил точно такой же код (буквально, копировать/вставить), и это сделало трюк.

Смежные вопросы