向TableViewController添加后退按钮和手势

时间:2018-08-07 15:28:39

标签: ios swift

我最近开始了自己的处女秀,所以我仍然无法掌握。

我试图制作一个ViewController来显示一些结果,一个元素列表,每个元素都有2个字符串和一个图像。因此,我得到了以下代码:

@objc class TableViewController: UITableViewController {

    var tableList = [cellData]()
    var viewImages = false
    var advancedMode = false

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.allowsSelection = false
        self.tableView.delegate = self
    }

    func goBack(){
        dismiss(animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tableList.count;
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        switch tableList[indexPath.row].cell {
        case 2:
            let cell = Bundle.main.loadNibNamed("TableViewCell2", owner: self, options: nil)?.first as! TableViewCell2
            cell.Header.text = tableList[indexPath.row].header
            cell.Details.text = tableList[indexPath.row].details
            cell._Image.image = tableList[indexPath.row]._image

            return cell

        default:
            let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
            return cell

        }

    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
    {
        switch tableList[indexPath.row].cell {
        case 1:
            return 127.0;
        case 2:
            return 50 +
                ((tableList[indexPath.row].details != nil && tableList[indexPath.row].details.count > 0) ? 100 : 0) +
                (tableList[indexPath.row]._image != nil && tableList[indexPath.row]._image.size.height > 0
                    ? ((tableList[indexPath.row]._image.size.width/self.view.frame.size.width) *  tableList[indexPath.row]._image.size.height)
                    : 0);  // TODO: here we should get the proper height from the image based on the with of the view
        default:
            return 50.0;
        }
    }

    @objc
    func clearTable() ->Void {
        tableList.removeAll()
    }

    @objc
    func addElement(header: String, details: String, image:UIImage) -> Void{
        tableList.append(cellData(cell: 2, header: header, details: details, _image: image))
    }


}

通过列出结果,此代码非常有用。但我想添加后退功能。

  • 我尝试将第一个控制器嵌入导航控件,但对于tableViewController,没有带后退按钮的标题。不在情节提要中或运行程序时。

  • 我尝试通过将背景设置为红色并添加UIButton来使用此功能,但是没有按钮。但是在运行程序时出现了红色区域

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { ..  }
    
  • 我尝试用向后滑动手势替换按钮,但是那里也没有反应

有什么想法可能是我犯了一个错误或我想念什么?

更新1 : 在上一个视图控制器中,我使用以下代码转到TableViewController:

TableViewController *vc = [[TableViewController alloc] init];
[self presentViewController:vc animated:YES completion:nil];

完成某个过程/条件后,我需要跳到TableViewController(因此不必按按钮)

3 个答案:

答案 0 :(得分:1)

我认为您正在使用情节提要。当您通过拖动到另一个视图控制器并通过鼠标创建一个segue时,应该出现一个小菜单,如下所示:

enter image description here

Action Segue部分下,有segue类型。对于您的情况,您需要选择Show。现在,如果您将第一个视图控制器嵌入到导航控制器中,则后退按钮将出现在第二个视图控制器上。

如果您的第一个视图控制器已经嵌入导航控制器中,并且您将Show创建到另一个控制器中,则这也将起作用。

要检查segue的种类,只需点击其箭头,然后在实用程序区域(右侧面板)中,您可以在Kind部分下查看其种类。

编辑

如果您使用的是Objective-C并以编程方式进行隔离,则可以采用以下方法: 每个视图控制器都有一个名为navigationController的属性,该属性持有对其所嵌入的导航控制器的引用。如果您的视图控制器已经嵌入在导航控制器中,请按照以下步骤进行过渡:

 - (IBAction)buttonTapped:(UIButton *)sender {
ViewController2 *viewController2 = [[ViewController2 alloc ] init];

[self.navigationController pushViewController: viewController2 animated:YES];

}

P.s。您可以查看斯坦福大学的iOS开发课程:CS193P。它是免费的。

答案 1 :(得分:0)

您是否尝试过将左栏按钮设置为:

let button1 = UIBarButtonItem(image: UIImage(named: "imagename"), style: .plain, target: 
self, action: Selector("action")) // action:#selector(Class.MethodName) for swift 3
self.navigationItem.rightBarButtonItem  = button1

答案 2 :(得分:0)

好吧,当我在CS193P上观看了一些视频(感谢@Tigran Iskandaryan)并在另一个项目中播放后,我找到了解决方案。

因此,问题是: [self presentViewController:vc animated:YES completion:nil];

根据我的阅读,为了使NavigationController能够正常工作,需要将ViewController堆叠起来。而且因为我使用了一种不同的方式来跳转到下一个ViewController,所以不需要显示导航栏。

因此,解决方法是使用pushViewController而不是presentViewController。这样,ViewController将被堆叠在NavigationBar中。

因此,它将是:

TableViewController *vc = [[TableViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];

请注意,为了使其正常工作,我必须确保将nMvigationController嵌入到根ViewController中