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 следует приветствовать.
Я предполагаю, что проблема заключается не в этом контроллере, а в контроллере представления этого сегмента, поэтому вы можете снова проверить его код. –
вам нужно снова проверить имя segue – Lamar
В настоящее время я не вижу ошибок в целевом контроллере View. Прямо сейчас это довольно урезано. Просто имейте переменную, чтобы поймать пройденный объект, но я ничего с этим не делаю, потому что еще не получил этого еще. Я даже попытался удалить передаваемые данные и просто попытался открыть новое представление. –