- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
Swift 4:我正在使用 NSNotification post 并观察两个 View Controller 之间的对象。我的问题是更新观察给定接收到的对象的 viewController。
有两件事需要更新
1. 按钮的setTitle,
2. UIPageViewController 上的当前页面。
如何更新这两个东西?
我今天和昨天为此工作了一整天,但没有任何结果。
我试过使用 struct 来做更新和普通变量。
**YellowViewController - Observes -> Issue here**
let searchedReturnedKey = "Searched"
class YellowViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
let pageView = PageView()
let searched = Notification.Name(rawValue: searchedReturnedKey)
private var isAnimating = false
struct structure {
static var SearchedIndex = Int()
}
override func viewDidLoad() {
super.viewDidLoad()
dataSource = self
delegate = self
setupUIPageView()
setupNavigationBarItem()
createObserver()
}
func createObserver(){
NotificationCenter.default.addObserver(self, selector: #selector(YellowViewController.updateVerseView(notification:)), name: searched, object: nil)
}
@objc func updateVerseView(notification: NSNotification) {
print("Observed")
structure.SearchedIndex = notification.object as! Int
let chapterIndexLabel = doneModel.ChapterIndex
let verseList = doneModel.chapterVerses
let pageView = PageView()
// HERE IS MY ISSUE - booklabel.text and pageview.verses
bookLabel.text = chapterIndexLabel[structure.SearchedIndex]
pageView.verses = verseList[structure.SearchedIndex]
print(structure.SearchedIndex, "Index")
}
func setupUIPageView() {
let verseList = bibleModel.chapterVerses
let chapterIndexLabel = bibleModel.ChapterIndex
let pageViewControllers = [pageView] // Important! UIPageViewController sets ViewController in a list to enable swiping. - Understand this.
pageView.verses = verseList.first! // Important! Setups verses for first view.
bookLabel.text = chapterIndexLabel.first!
setViewControllers(pageViewControllers, direction: .forward, animated: true, completion: nil)
}
var bookLabel = UILabel()
func setupLeftNavItems() {
let bookButton = UIButton(type: .system)
bookButton.setTitle(bookLabel.text! + " 1", for: .normal)
bookButton.setTitleColor(goldColor, for: .normal)
bookButton.titleLabel?.font = UIFont(name: "AvenirNext-DemiBold", size: 18)
bookButton.addTarget(self, action: #selector(handleSearch), for: .touchUpInside)
// bookButton.frame = CGRect(x: 30, y: 0, width: 54, height: 34)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: bookButton)
}
@objc func handleSearch() { // Handles openeing SearchViewController
let searchViewController = SearchViewController()
let navController = UINavigationController(rootViewController: searchViewController)
present(navController, animated: true, completion: nil)
}
func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
isAnimating = true
}
// Handles swiping right - To next chapter.
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
if isAnimating {
return nil
}
let verseList = bibleModel.chapterVerses
let currentVerseView = (viewController as! PageView).verses
let currentIndex = verseList.index(of: currentVerseView)
let chapterIndexLabel = doneModel.ChapterIndex
if currentIndex! < verseList.count - 1 {
let pageView = PageView()
pageView.verses = verseList[currentIndex! + 1 ]
bookLabel.text = chapterIndexLabel[currentIndex! + 1]
print("Swiped right")
setupLeftNavItems()
createObserver()
return pageView
}
return nil
}
// Handles swiping left - To previous chapter
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
if isAnimating {
return nil
}
let verseList = bibleModel.chapterVerses
let currentVerseView = (viewController as! PageView).verses
let currentIndex = verseList.index(of: currentVerseView)
let chapterIndexLabel = doneModel.ChapterIndex
if currentIndex! > 0 {
let pageView = PageView()
pageView.verses = verseList[currentIndex! - 1]
bookLabel.text = chapterIndexLabel[currentIndex! - 1]
setupLeftNavItems()
print("Swiped left")
createObserver()
return pageView
}
return nil
}
}
SearchViewController - 发布
class SearchViewController: UITableViewController, UISearchBarDelegate {
let cellId = "cellId"
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.titleView = navSearchBar
setupView()
}
func setupView() {
tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
tableView.delegate = self
tableView.dataSource = self
navSearchBar.delegate = self
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Books.count
}
**I post the data from this function**
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath)
let cellLabelContent = cell!.textLabel!.text
let cellLabelIndex = Books.firstIndex(of: cellLabelContent!)
print("Book name:", cellLabelContent!, "index:", cellLabelIndex!)
let notificationName = Notification.Name(rawValue: searchedReturnedKey)
NotificationCenter.default.post(name: notificationName, object: cellLabelIndex)
dismiss(animated: true, completion: nil)
}
}
实际结果-> 无更新
预期结果 -> 更新给定对象
最佳答案
为了能够更新 UIPageViewController 的当前 View ,您需要在 updateVerseView 中执行此操作。
setViewControllers 方法是在 UIPageViewController 中更新 View 的正确且有效的方法。
let pageViewControllers = [pageView]
pageView.verses = verseList[structure.searchedIndex]
setViewControllers(pageViewControllers, direction: .forward, animated: true, completion: nil)
要更新 bookLabel.txt,您只需调用 setupLeftNavItems()
函数即可。
关于ios - Swift:使用 NSNotification 更新 Button.setTitle 和当前 UIPageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54473234/
我正在为我的 iPhone 应用开发一个类,我希望它能够注册并了解应用状态的变化(UIApplicationDidEnterBackgroundNotification 等)。有没有一种方法可以注册通
这是我得到的错误 Thread 1:EXC_BAD_ACCESS (code=2, address=0xb7ffffc) 在这条线上 [[NSNotificationCenter defaultCen
你能解释一下什么是NSNotification 的目的,以及我可以在哪些情况下使用是吗? 通知是否调用所有类在应用程序中,或者它是否调用特定的类,通过传递代表? 是否可以创建1通知,并在多个类(cla
我正在开发一个电子书阅读器,我遇到了以下问题。我正在使用 IBAction 方法来发布 NSNotification,一旦点击按钮,它就会调用操作方法。它第一次工作得非常好...每次我点击按钮时都必须
谁能解释一下 NSNotificationCenter 的重要性吗? 在哪里使用它们? NSNotificationCenter 与 AppDelegate 有什么区别? 最佳答案 Apple 在 C
在我的 NSApp 委托(delegate)中,我添加了一个对象的观察者,该对象是 NSWindow 子类,该对象在委托(delegate)本身中启动,并在单击窗口后发布通知。选择器也在委托(dele
我正在尝试在我的多线程应用程序中获取通知 NSTaskDidTerminateNotification,但无法使其正常工作。当我在单线程应用程序上测试它时,它似乎确实有效。在 init 中,我有 [[
在单线程中使用 NSNotifications 时是否存在竞争条件问题?这是一个示例方法: - (void) playerToggled: (NSNotification *) notificatio
WebKit 的 WebHistory API 按日期分隔其项目。因此,当日期发生变化时,我需要重新分配任何“昨天”和/或“(早些时候)今天”(或“明天”!)标签。有 NSNotification 吗
我计划编写一个小守护程序来检测另一个应用程序是否崩溃,一直认为系统会发送 NSWorkspaceDidTerminateApplicationNotification,但事实并非如此。 假设我不想创建
我正在阅读 iOS Big Nerd Ranch 书,其中一个示例显示了如何将观察者添加到 NSNotificaionCenter : [[NSNotificationCenter defau
我想要一种方法,可以暂停执行,直到收到通知后再继续。收到通知后它将继续执行。执行此操作的最佳方法是什么? 最佳答案 你可以使用 NSRunLoop - (BOOL)method { __block B
在我的游戏中,我正在发送 NSNotification 以在游戏过程中隐藏横幅广告,并在主菜单和游戏结束场景上显示横幅广告。这工作正常,除了由于某种原因每次我点击屏幕时都会调用隐藏广告的通知并且广告消
我的 didFinishLaunchingWithOptions 中有以下代码 NotificationCenter.default.addObserver( self,
什么相当于 Android 中的 NSNotification? 我需要能够发送和接收来自任意类(不一定是 Activity )的通知。 最佳答案 这种模式称为 EventBus,并且有一些用于此的库
我正在做一个关于 NSNotification 的简单教程,但在正确执行它时遇到了一些问题。当我单击第一个 View 上的按钮时,第二个 View 中的文本字段没有得到更新。当我通过在 receive
我有一个多线程程序通过 NSNotificationCenter 发送消息(addObserver:.. 和 postNotification:... 方法)。 线程订阅不同的通知,其中一些是共享的,
我在旋转设备时收到多个 UIKeyboardDidShowNotification 和 UIKeyboardDidHideNotification 通知,我不明白为什么。 我有一个应用程序,可以让您为
我经常在 viewDidLoad 中注册 NSNotification 并在 dealloc 中取消注册。我们在 ios 5 中没有 dealloc。我在哪里注销 NSNotification? 最佳
有没有办法在不延迟任何当前完成的代码的情况下触发 NSNotification(可能会触发大量工作)? 具体来说,我有一个 UIPanGestureRecognizer,它允许用户平移几个月、一月、二
我是一名优秀的程序员,十分优秀!