程序初始化的UITableViewController的一个自定义子类tableviewcell

问题描述:

ENV:xcode6,迅速程序初始化的UITableViewController的一个自定义子类tableviewcell

我试图用SLPagingViewSwift作为rootcontroller,并在页面中的一个,我想用一个自定义的UITableViewController。

我不知道为什么它不工作,总是抛出“2015-02-06 23:03:18.228 xiaoyu [4825:46536]由于未捕获的异常'NSInternalInconsistencyException',终止应用程序,原因:'无法退出具有标识符PersonCell的单元格 - 必须为该标识符注册一个笔尖或类别,或者在故事板“”中连接原型单元格,并且我已经在故事板中将标识符定义为'PersonCell'。

这里是主controlelr代码:

var controller: SLPagingViewSwift? 

var ctr1 = PersonTableViewController() 
var ctr2 = UIViewController() 
var ctr3 = UIViewController() 

override func viewDidLoad() { 
    super.viewDidLoad() 


    var navTitleLabel1 = UILabel() 
    navTitleLabel1.text = "Home" 
    navTitleLabel1.font = UIFont(name: "Helvetica", size: 20) 
    navTitleLabel1.textColor = UIColor.whiteColor() 
    var navTitleLabel2 = UILabel() 
    navTitleLabel2.text = "Discover" 
    navTitleLabel2.font = UIFont(name: "Helvetica", size: 20) 
    navTitleLabel2.textColor = UIColor.whiteColor() 
    var navTitleLabel3 = UILabel() 
    navTitleLabel3.text = "Activity" 
    navTitleLabel3.font = UIFont(name: "Helvetica", size: 20) 
    navTitleLabel3.textColor = UIColor.whiteColor() 

    var orange = UIColor(red: 255/255, green: 69.0/255, blue: 0.0/255, alpha: 1.0) 
    var gray = UIColor(red: 0.84, green: 0.84, blue: 0.84, alpha: 1.0) 


    ctr1.title = "Ctr1" 
    ctr1.view.backgroundColor = UIColor.whiteColor() 
    ctr2.title = "Ctr2" 
    ctr2.view.backgroundColor = UIColor.yellowColor() 
    ctr3.title = "Ctr3" 
    ctr3.view.backgroundColor = UIColor.blueColor() 

    controller = SLPagingViewSwift(items: [navTitleLabel1, navTitleLabel2, navTitleLabel3], controllers: [ctr1,ctr2,ctr3], showPageControl: false) 

    controller?.currentPageControlColor = UIColor.whiteColor() 
    controller?.tintPageControlColor = UIColor(white: 0.799, alpha: 1.0) 
    controller?.pagingViewMoving = ({ subviews in 
     for v in subviews { 
      var lbl = v as UILabel 
      var c = gray 

      if(lbl.frame.origin.x > 45 && lbl.frame.origin.x < 145) { 
       c = self.gradient(Double(lbl.frame.origin.x), topX: Double(46), bottomX: Double(144), initC: orange, goal: gray) 
      } 
      else if (lbl.frame.origin.x > 145 && lbl.frame.origin.x < 245) { 
       c = self.gradient(Double(lbl.frame.origin.x), topX: Double(146), bottomX: Double(244), initC: gray, goal: orange) 
      } 
      else if(lbl.frame.origin.x == 145){ 
       c = orange 
      } 
      lbl.textColor = c 
     } 
    }) 


    controller?.didChangedPage = ({ currentIndex in 
     println(currentIndex) 
    }) 

    self.setViewControllers([controller!], animated: true) 
} 

PersonTableViewController是自定义TableViewController,并在控制器,我使用自定义tableviewcell。

下面是代码为PersonTableViewController:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete method implementation. 
    // Return the number of rows in the section. 
    return 1 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("PersonCell", forIndexPath: indexPath) as PersonTableViewCell 
    cell.name.text = "aaa" 

    return cell 
} 
+0

有没有从你的tableview包含PersonCell到你的表视图的出口(在故事板)试图离开? – timgcarlson 2015-02-06 15:42:30

+0

是的。事情是,如果我不使用SLPagingViewSwift作为根控制器,它可以正常工作,这意味着我的自定义PersonTableViewController由故事板初始化,而不是由我自己初始化。 – des 2015-02-07 01:49:14

方法viewDidLoad应与表视图寄存器细胞类。的UITableViewController方法是:

func registerClass(_ cellClass: AnyClass,forCellReuseIdentifier identifier: String) 

所以,你的情况应该是:

ctr1.registerClass(PersonTableViewCell.self, forCellReuseIdentifier: "PersonCell") 
+0

非常感谢您的帮助。但似乎没有奏效。在我添加你的方法后,它会抛出另一个异常“致命错误:意外地发现零,同时展开一个可选值”,它指向“cell.name.text =”aaa“”,在这种情况下单元格中的名称属性为零。 – des 2015-02-07 01:52:23

+0

当我尝试使用“viewDidLoad”函数中的“registerNib”后,它解决了。我不知道这两者之间有什么区别。 – des 2015-02-09 13:41:29