一个视图控制器的输入附件视图错误地出现在另一个视图控制器

时间:2017-06-30 12:16:42

标签: ios swift

我在我的应用中遇到了一个错误,即第一个视图控制器中的UIToolbar出现在第三个视图控制器中,尽管我覆盖了输入附件视图。

第一个视图控制器:

class FirstViewController: BaseViewController {

    @IBOutlet weak var toolbar: UIToolbar!

    override var inputAccessoryView: UIView? {
        return toolbar
    }

    ...

第二个视图控制器:

class SecondViewController: BaseViewController {

    override var inputAccessoryView: UIView? {
        return nil
    }

    ...

第三视图控制器:

class ThirdViewController: BaseViewController {

    override var inputAccessoryView: UIView? {
        return nil
    }

    ...

我不确定导致工具栏出现在第二个视图控制器中的原因。这些视图控制器没有嵌入到UINavigationController中,因此我不了解它如何能够转移到另一个屏幕。

2 个答案:

答案 0 :(得分:0)

所以这是一个难以解决的问题,但我最终想出了问题。

所以问题是方法find "$code_path" -type f -name '*.h' -o -name '*.c' -o -name '*.cpp' \ -exec file {} + | awk '!/broken/ {print $1}' 。如果我们按如下方式设计故事板:

canBecomeFirstResponder

当我们转到FirstViewController -(show)-> SecondViewController -(show )-> ThirdViewController时,iOS会询问ThirdViewController是否可以成为第一响应者。如果FirstViewController返回true,则canBecomeFirstResponder的输入附件视图将显示在FirstViewController中。

不幸的是,这个解决方案有点令人讨厌,但这是我现在能想到的唯一解决方案。

基本视图控制器:

ThirdViewController

第一个视图控制器:

class BaseViewController: UIViewController {

    var shouldBecomeFirstResponder: Bool = false

    override var canBecomeFirstResponder: Bool {
        return shouldBecomeFirstResponder
    }

    ...
}

第二个视图控制器:

class FirstViewController: BaseViewController {

    @IBOutlet weak var toolbar: UIToolbar!

    override func viewDidLoad() {
        super.viewDidLoad()
        shouldBecomeFirstResponder = true
    }

    override var inputAccessoryView: UIView? {
        return toolbar
    }

    @IBAction didTap() {
        shouldBecomeFirstResponder = false
        performSegue(withIdentifier: "showSecond", sender: self)
    }
    ...
}

第三视图控制器:

class SecondViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        shouldBecomeFirstResponder = false
    }
    ...

    @IBAction didTap() {
        performSegue(withIdentifier: "showThird", sender: self)
    }

    ...
}

答案 1 :(得分:0)

如果@ entelect-ca假设是正确的 - 我宁愿检查FirstViewController控制器是否可见。

此外,没有开箱即用的方法来检查控制器是否可见(特别是在处理选项卡时)。因此,您可以将visible属性添加到视图控制器中:

@property BOOL visible;

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.visible = true;
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    self.visible = false;
}

- (BOOL)canBecomeFirstResponder {
    return self.visible;
}