一个视图控制器中的两个表视图 swift

Posted

技术标签:

【中文标题】一个视图控制器中的两个表视图 swift【英文标题】:two table views in one viewcontroller swift 【发布时间】:2016-01-13 18:35:08 【问题描述】:

我正在尝试快速制作一个优缺点列表,但每当我删除一个缺点时,它就会删除一个优点。我认为索引路径链接到优缺点视图控制器是一个问题,但我不知道如何或在哪里可以将它们分开

class prosConsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

@IBOutlet var prosTableViewOutlet: UITableView!
@IBOutlet var consTableViewOutlet: UITableView!



@IBOutlet var tableViewOutlet: UITableView!

var colleges : [NetCollege] = []


@IBOutlet var consTableView: UITableView!
var collegesTwo : [NetCollegeTwo] = []

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int

    if tableView == tableViewOutlet
    
        return colleges.count
    
    else
    
        return collegesTwo.count
    


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

    if tableView == tableViewOutlet
    
        let cell = tableViewOutlet.dequeueReusableCellWithIdentifier("cellID")  as! tableViewCell
        //the line under maybe?
        let college = colleges[indexPath.row]

        cell.textLabel?.text = college.name


        return cell

    
    else
    
        let cellTwo = consTableView.dequeueReusableCellWithIdentifier("IDCell")  as! tableViewCell
        let collegeTwo = collegesTwo[indexPath.row]

        cellTwo.textLabel?.text = collegeTwo.conName


        return cellTwo

    




override func viewDidLoad()

    super.viewDidLoad()
    editButtonItem().tag = 0

    func shouldAutorotate() -> Bool 
        return false
    

    func supportedInterfaceOrientations() -> Int 
        return UIInterfaceOrientation.LandscapeRight.rawValue
    







@IBAction func plusButtonTwo(sender: UIBarButtonItem)

    let alertTwo = UIAlertController(title: "Add Con", message: nil, preferredStyle: .Alert)
            alertTwo.addTextFieldWithConfigurationHandler
                 (textField) -> Void in
                    textField.placeholder = "Add Con Here"
            
            let cancelActionTwo = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)
            alertTwo.addAction(cancelActionTwo)


            let addActionTwo = UIAlertAction(title: "Add", style: .Default)  (action) -> Void in
                let addCollegesTextFieldTwo = (alertTwo.textFields?[0])! as UITextField

                let netCollegeTwo = NetCollegeTwo(nameTwo: addCollegesTextFieldTwo.text!)


                self.collegesTwo.append(netCollegeTwo)
                self.consTableView.reloadData()
            

            alertTwo.addAction(addActionTwo)
            self.presentViewController(alertTwo, animated: true, completion: nil)



@IBAction func onTappedPlusButton(sender: UIBarButtonItem)


    let alert = UIAlertController(title: "Add Pro", message: nil, preferredStyle: .Alert)
    alert.addTextFieldWithConfigurationHandler
         (textField) -> Void in
        textField.placeholder = "Add Pro Here"
        
    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)
    alert.addAction(cancelAction)


    let addAction = UIAlertAction(title: "Add", style: .Default)  (action) -> Void in
        let addCollegesTextField = (alert.textFields?[0])! as UITextField

        let netCollege = NetCollege(name: addCollegesTextField.text!)


        self.colleges.append(netCollege)
        self.tableViewOutlet.reloadData()
    

    alert.addAction(addAction)
    self.presentViewController(alert, animated: true, completion: nil)





   func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)

    if editingStyle == UITableViewCellEditingStyle.Delete
    

            colleges.removeAtIndex(indexPath.row)
            tableViewOutlet.reloadData()

    

func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool

    return true

【问题讨论】:

【参考方案1】:

如果你想在一个视图控制器中实现所有这些,你可以试试这个:

  func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)

    if editingStyle == UITableViewCellEditingStyle.Delete
    
        if tableView == tableViewOutlet
        
           colleges.removeAtIndex(indexPath.row)
           tableView.reloadData()
        
        else
        
           collegesTwo.removeAtIndex(indexPath.row)
           tableView.reloadData()
        
    

但在这种情况下,更好的解决方案是创建两个名为 DataSourceOne、DataSourceTwo(或 TableViewModelOne、TableViewModelTwo)的类,并在那里实现所有相关逻辑。这甚至可以是一个类 DataSource 的两个实例,具体取决于您的具体需要。然后你可以在viewDidLoad 中实例化这些帮助类,并将它们分配给你的表视图的dataSourcedelegate 属性。您还需要在某处为它们提供强有力的参考,因为dataSourcedelegate 属性是星期。

【讨论】:

以上是关于一个视图控制器中的两个表视图 swift的主要内容,如果未能解决你的问题,请参考以下文章

一个视图控制器中的两个表视图,快速

在同一个视图控制器中使用 2 个表视图(swift 3)

2 在一个视图控制器中使用 Swift 3 的表视图

如何在 swift 4 中的另一个表视图控制器中获取该表视图单元格中的文本字段文本?

用数据填充视图中的表格视图,swift2

IOS/Swift:将表视图中的对象传递给详细视图控制器