UITableView in Swift

前端 未结 17 1315
滥情空心
滥情空心 2020-12-04 08:09

I\'m struggling to figure out what\'s wrong with this code snippet. This is currently working in Objective-C, but in Swift this just crashes on the first line of the method.

相关标签:
17条回答
  • 2020-12-04 08:15

    Sulthan's answer is clever, but the real solution is: don't call dequeueReusableCellWithIdentifier. That was your mistake at the outset.

    This method is completely outmoded, and I'm surprised it has not been formally deprecated; no system that can accommodate Swift (iOS 7 or iOS 8) needs it for any purpose whatever.

    Instead, call the modern method, dequeueReusableCellWithIdentifier:forIndexPath:. This has the advantage that no optionals are involved; you are guaranteed that a cell will be returned. All the question marks and exclamation marks fall away, you can use let instead of var because the cell's existence is guaranteed, and you're living in a convenient, modern world.

    You must, if you're not using a storyboard, register the table for this identifier beforehand, registering either a class or a nib. The conventional place to do that is viewDidLoad, which is as early as the table view exists at all.

    Here's an example using a custom cell class:

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.registerClass(MyCell.self, forCellReuseIdentifier: "Cell")
    }
    
    // ...
    
    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath:indexPath) as MyCell
        // no "if" - the cell is guaranteed to exist
        // ... do stuff to the cell here ...
        cell.textLabel.text = // ... whatever
        // ...
        return cell
    }
    

    But if you're using a storyboard (which most people do), you don't even need to register the table view in viewDidLoad! Just enter the cell identifier in the storyboard and you're good to go with dequeueReusableCellWithIdentifier:forIndexPath:.

    0 讨论(0)
  • 2020-12-04 08:15

    Well, I have done this way:

    Steps for UITableView using Swift:

    • Take UITableView in ViewController
    • Give Referencing Outlets in ViewController.swift class
    • Give Outlets dataSource & delegate to ViewController

    Now Swift code in ViewController.swift class:

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
        @IBOutlet weak var mTableView: UITableView!
    
        var items: [String] = ["Item 1","Item 2","Item 3", "Item 4", "Item 5"]
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
            self.mTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.items.count;
        }
    
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            var cell:UITableViewCell = self.mTableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell
    
            cell.textLabel?.text = self.items[indexPath.row]
             println(self.items[indexPath.row])
    
            return cell
        }
    
        func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
            println("You have selected cell #\(indexPath.row)!")
        }
    }
    

    Now it's time to Run your program.

    Done

    0 讨论(0)
  • 2020-12-04 08:15

    I went through your codes and most probably the reason for the crash is you are trying to typecast an optional value which is not assigned

    Now consider the line of code below

    var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell
    

    When there are no cells in the tableview you are still trying to typecast as UITableView.When the compiler tries to typecast nil value you face this issue

    The correct statement should be

    var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell") 
    

    You can use if else statement to typecast for values which holds

    0 讨论(0)
  • 2020-12-04 08:17

    Using "as" keyword would do the following two steps:
    1.creating a optional value which wrap a variable of UITableViewCell;
    2.unwrapping the optional value.

    So,by doing this

    var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Component") as UITableViewCell
    

    you would get a "plain" UITableViewCell type variable: cell.Theoretically speaking, it's ok to do this.But the next line

    if (cell == nil) {}
    

    makes trouble, because in swift, only the optional value can be assigned with nil.

    So, to solve this problem, you have to make cell a variable of Optional type. just like this:

    var cell = tableView.dequeueReusableCellWithIdentifier("Component") as? UITableViewCell
    

    using the keyword "as?" would create a Optional variable, and this, undoubtedly, can be assigned with nil.

    0 讨论(0)
  • 2020-12-04 08:17

    Why not this?

    (please delete if i am not in the goal...)

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    
        if let cell: UITableViewCell = theTableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as? UITableViewCell {
            // cell ok
        }else{
           // not ok
        }
    }
    
    0 讨论(0)
  • 2020-12-04 08:17

    Try this code

    var cell:CustomTableViewCell = tableView.dequeueReusableCellWithIdentifier("CustomTableViewCell") as CustomTableViewCell
    cell.cellTitle.text="vijay"
    

    https://github.com/iappvk/TableView-Swift

    0 讨论(0)
提交回复
热议问题