【问题标题】:After using dismissViewController on a modal view, the intended view pushes multiple times在模态视图上使用dismissViewController后,预期视图推送多次
【发布时间】:2016-11-03 07:45:09
【问题描述】:

这是一个我似乎无法在线找到任何解决方案的问题。

我有以下情节提要:

初始表视图中的行与您可以在其他视图上方看到的视图有一个 push segue。

现在,当我在初始表格视图中按下条形按钮时,它会对新的导航控制器(中间的那个)执行模态搜索,您可以在其中创建对象。

在最右侧的 selectFriends 视图中,当您按下完成时,它会运行以下代码:

self.dismissViewController(true, completion: nil)

然后它让我回到最初的表格视图这是我想要的。

这就是奇怪的地方

如果我从其中的第一个视图中关闭模态导航控制器,它工作正常

但是,当我从 selectFriends 视图中关闭模式导航控制器时,它会返回到初始表格视图,

然后在显示模态视图之前连续运行 goToChat segue 的次数。

它甚至不运行 didSelectRowAtIndexPath 代码。

我的猜测是它与初始导航控制器中视图和 segue 的一些映射或存储有关。

didSelectRowAtIndexPath 的初始表视图有这个:

    // finds user item to pass to UserProfileView
    print("row selected")

    if self.resultSearchController.active {

        self.selectedItem = self.filteredItemsList[indexPath.row]

    } else {

        self.selectedItem = self.itemsList[indexPath.row]


    }

    self.ref.child("users/\(self.currentUser!.uid)").observeEventType(.Value, withBlock: { (snapshot) -> Void in

        self.currentUserItem = UserItem(snapshot: snapshot)
        self.performSegueWithIdentifier("goToChat", sender: nil)

    })


}

如果您有解决方案,请告诉我。

最好的祝愿, 哈立德

【问题讨论】:

  • 看来问题出在您的observeEventType 方法上。那是什么?我从来没有见过这样的东西。
  • 这是一个每次更改数据库时都会触发的 Firebase 数据调用......因此,当创建对象时,无论选择如何,它都会运行。你是绝对正确的!感谢您引起我的注意。
  • 对,所以我的猜测是,通过调用observeEventType,你已经“注册”了观察者,所以现在它再次触发,因为它仍在观察......这就是为什么代码没有需要再次运行; “块”已被保留,因此它现在自行运行。
  • 它就是这样做的。谢谢!
  • 您应该将 firebase 标签添加到您的问题中,并且您应该回答自己的问题!完全合法(实际上是鼓励)。可能会帮助其他人。

标签: ios iphone swift firebase firebase-realtime-database


【解决方案1】:

这有点尴尬。我实际上是在深入研究 UIKit 代码来查看 presentViewController 和 performSegueWithIdentifier 函数的代码,希望能找到我的答案。

但正如马特在 cmets 中指出的那样,observeEventType 函数看起来不合适。仔细一看,我意识到了自己的错误。

每次我选择一个表行时,它都会为数据库中的更改注册一个新的事件监听器,因此一旦创建了一个新项目,它就会在监听器已注册的次数内启动代码(包括 segue) .

我是这样解决的:

// This is a Firebase "user object" that carries the current user's ID

let currentUser = FIRAuth.auth().currentUser 

// Now we set the listener in the viewDidLoad to simply update the currentUserItem
and not perform any segue or code that we only need to run once.

override func viewDidLoad() {

    self.ref.child("users/\(self.currentUser.uid)").observeEventType(.Value, withBlock: { (snapshot) -> Void in

    self.currentUserItem = UserItem(snapshot: snapshot)

    })

}

现在在didSelectRowAtIndexPath: 方法中,我们只在该行获取selectedItem 并运行segue。一次。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    // finds item in respective row to enter chat
    if self.resultSearchController.active {

        self.selectedItem = self.filteredItemsList[indexPath.row]

    } else {

        self.selectedItem = self.ItemsList[indexPath.row]


    }

    self.performSegueWithIdentifier("goToChat", sender: nil)

}

再次感谢马特!

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2012-12-22
    • 2011-01-29
    相关资源
    最近更新 更多