来自parentVIewController的按钮仍然在pushViewController之后显示在屏幕上

时间:2015-12-12 14:34:07

标签: ios swift uinavigationcontroller

我是IOS的新手,我陷入了这个奇怪的问题 它真的是一个简单的演示,我只想跳转到另一个viewController。

//parentViewController
import UIKit
import SnapKit

class ViewController: UINavigationController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.view.backgroundColor = UIColor.whiteColor()
    let button = UIButton()
    button.frame = CGRectMake(100, 100, 200, 100)
    button.backgroundColor = UIColor.greenColor()
    button.setTitle("Search Button", forState: UIControlState.Normal)
    button.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
    self.view.addSubview(button)
}

func buttonAction(sender:UIButton!){
    print("Button tapped")
    let searchVC = MfSearchViewController()
    self.pushViewController(searchVC, animated: true)
}

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

}

这是目标viewController

class MfSearchViewController:UIViewController{
    /// UI component
    var tableView:UITableView!
    var searchBar:UISearchBar!
    var searchLabel:UILabel!
    ///
    var dataSource = NSMutableArray()
    var currentIndexPaht: NSIndexPath?
    var screenObj = UIScreen.mainScreen().bounds




    override func viewDidLoad() {
        super.viewDidLoad()
        for index in 0...12{
            let model = SearchResultModel(searchWord: "java\(index+1)", searchResult: "1500")
            dataSource.addObject(model)
        }
        self.view.backgroundColor = UIColor.lightGrayColor()
        tableView = UITableView(frame: self.view.bounds, style: UITableViewStyle.Plain)
        //tableView = UITableView(frame: CGRectMake(0,20,screenObj.width,screenObj.height), style: UITableViewStyle.Grouped)
        tableView.delegate = self
        tableView.dataSource = self
        view.addSubview(tableView)
        self.title = "target"


    }

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


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

extension MfSearchViewController: UITableViewDataSource{

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cellIdentifier: String = "SearchResultCellIdentifier"
        // may be no value, so use optional
        var cell: SearchResultCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? SearchResultCell
        if cell == nil { // no value
            cell = SearchResultCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellIdentifier)
        }
        let model: SearchResultModel? = dataSource[indexPath.row] as? SearchResultModel
        cell!.configureCell(model)
        return cell!
    }

    func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return dataSource.count
    }

   }

extension MfSearchViewController: UITableViewDelegate{
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print(indexPath);
    }

}

但是在pushViewcontroller之后,来自parentViewController的按钮仍然存在... plz帮助我....非常感谢...

enter image description here

3 个答案:

答案 0 :(得分:0)

我不是UIViewControllers和故事板的专家,但现在你可以在更改viewControllers之前删除按钮。

 button.removeFromSuperView()

您必须使按钮成为全局属性,以便可以在创建它的ViewDidLoad之外调用它。 我不确定这是否是预期的行为,或者是否应该自动删除该按钮。

答案 1 :(得分:0)

您正在向UINavigationController的视图添加子视图。这样做会导致视图出现在其视图控制器的所有后续屏幕上。通常不需要向UINavigationController的视图添加视图。相反,您应该创建动态推送并弹出到导航控制器堆栈上的视图控制器。也就是说,使用按钮创建一个根视图控制器,该按钮调用执行以下操作:

let searchVC = MfSearchViewController()
self.navigationController.pushViewController(searchVC, animated: true)

在新视图转换时关闭按钮转换视图。简单地调用button.removeFromSuperView()会导致按钮消失,但会非常突然,并且不符合iOS用户体验或设计模式。

答案 2 :(得分:0)

我知道你会得到答案,但也许我可以发现一些关于视图之间转换的技巧。

self.pushViewController(searchVC, animated: true)

“自我”表示您在UIViewController对象中,而UIViewController会推送它。因此,例如,如果您从A中推送B类,则在B类中,您将无法在导航堆栈的控制下生根。你也不在UINavigationController堆栈。

self.navigationController.pushViewController(searchVC, animated: true)

现在您正在使用UIViewController个对象UINavigationController并且能够处理B类的导航堆栈。这是推送,呈现或处理UIView个对象之间的每个转换的真正方法