我正在使用swift做一个简单的tableview应用程序,在点击表格行后以编程方式打开一个新的视图控制器:
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
//GLobals
@IBOutlet weak var table: UITableView!
//Table View Data
let cats :[String] = ["Gala","Vito","Odin","Ema"]
override func viewDidLoad() {
super.viewDidLoad()
table.delegate = self
table.dataSource = self
}
// MARK: UITextFieldDelegate Methods
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cats.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = table.dequeueReusableCellWithIdentifier("CustomTextCell", forIndexPath: indexPath) as! UITableViewCell
let row = indexPath.row
cell.textLabel?.text = cats[row]
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
let row = indexPath.row
let cat : String = cats[row];
println(cat)
//Save cat for detail view
var defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(cat, forKey: "cat")
defaults.synchronize()
let detail:Detail = Detail();
self.presentViewController(detail, animated: true, completion: nil);
}
}
详细视图中的代码如下:
class Detail: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
let defeaults = NSUserDefaults.standardUserDefaults()
let cat = defeaults.stringForKey("cat")
var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
label.center = CGPointMake(160, 284)
label.textAlignment = NSTextAlignment.Center
label.text = cat
self.view.addSubview(label)
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
let home:ViewController = ViewController()
self.presentViewController(home, animated: true, completion: nil)
}
然而,当应用程序返回到ViewController时,我“在展开Optional值时意外地发现了nil “
我已经尝试了一些其他问题的答案,包括用if == nil一些值翘曲,但我仍然找不到问题所在。
我假设UIViewController没有再次加载UITableViewDelegate和UITableViewDataSource,但我不明白为什么......以及如何从另一个视图加载它们?
答案 0 :(得分:3)
您可以从代码中初始化touchesBegan中的ViewController,因为新分配的ViewController中的结果表为nil。在您从InterfaceBuilder初始化之前,它是通过IBOutlet设置的。因此,当您在viewDidLoad中执行代码时,由于表不可用而导致应用程序崩溃。
您可以按照以下方式更改代码,它应该可以正常工作:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
dismissViewControllerAnimated(true, completion: nil)
}
答案 1 :(得分:1)
而不是
val.csv
你可能应该这样做
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
let home:ViewController = ViewController()
self.presentViewController(home, animated: true, completion: nil)
}
否则,您会为override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
self.dismissViewControllerAnimated(true, completion: nil)
}
创建一个未设置ViewController
的新实例,因此会tableView
,因此会崩溃。