在一个 UIViewController 中实现对多个 UITableView 的 peek 和 pop
Implement peek and pop to multiple UITableView in one UIViewController
我在一个 ViewController 和一个 UIView
中有两个 UITableView
,我正在尝试实现 Peek 和 Pop,但每次我都注册 table s,它只对第一个 table 有效。以下是我注册 UITableViews
:
的地方
if traitCollection.forceTouchCapability == UIForceTouchCapability.available {
registerForPreviewing(with: self, sourceView: self.tableView2)
registerForPreviewing(with: self, sourceView: self.tableView)
}
我的viewControllerForLocation
:
if tableView.point(inside: tableViewPoint, with: nil) {
guard let indexPath = self.tableView.indexPathForRow(at: location) else { return nil }
guard let cell = self.tableView.cellForRow(at: indexPath) else { return nil }
let storyBoard = UIStoryboard(name: "Home", bundle: nil)
guard let previewViewController = storyBoard.instantiateViewController(withIdentifier: "article_page") as? ArticleViewController else { return nil }
previewViewController.preferredContentSize = CGSize(width: 0.0, height: 550)
previewViewController.passedValue = article_ids[(indexPath as NSIndexPath).row]
previewingContext.sourceRect = cell.frame
return previewViewController
} else {
guard let indexPath = self.tableView2.indexPathForRow(at: location) else { return nil }
guard let cell = self.tableView2.cellForRow(at: indexPath) else { return nil }
let storyBoard = UIStoryboard(name: "Home", bundle: nil)
guard let previewViewController = storyBoard.instantiateViewController(withIdentifier: "article_page") as? ArticleViewController else { return nil }
previewViewController.preferredContentSize = CGSize(width: 0.0, height: 550)
if indexPath.row == 0 {
previewViewController.passedValue = 1001
} else {
previewViewController.passedValue = weekly_article_id_[(indexPath as NSIndexPath).row - 1]
}
previewingContext.sourceRect = cell.frame
return previewViewController
}
以上方法无效。 (它可能是错误的实现导致它对我没有任何意义)。我也尝试了 this 解决方案,但它没有按预期工作。我正在寻找的是这样的东西:
if sourceView == tableView {
//first tableView implementation
} else {
//second tableView implementation
}
感谢任何帮助。在过去的 4 小时里,我一直在努力。
我可能会尝试注册一次预览,源视图只是您的视图:
registerForPreviewing(with: self, sourceView: self.view)
然后在你的previewingContext
方法中将这个点转换为每个tableView以确定它是哪一个:
let tableViewPoint = self.view.convert(location, to: self.tableView)
if let indexPath1 = self.tableView.indexPathForRow(at: tableViewPoint) {
// Point is within first table - get the cell at this indexPath and handle
}
else {
let tableViewPoint2 = self.view.convert(location, to: self.tableView2)
if let indexPath2 = self.tableView2.indexPathForRow(at: tableViewPoint2) {
// Point is within second table - get the cell at this indexPath and handle
}
}
我在一个 ViewController 和一个 UIView
中有两个 UITableView
,我正在尝试实现 Peek 和 Pop,但每次我都注册 table s,它只对第一个 table 有效。以下是我注册 UITableViews
:
if traitCollection.forceTouchCapability == UIForceTouchCapability.available {
registerForPreviewing(with: self, sourceView: self.tableView2)
registerForPreviewing(with: self, sourceView: self.tableView)
}
我的viewControllerForLocation
:
if tableView.point(inside: tableViewPoint, with: nil) {
guard let indexPath = self.tableView.indexPathForRow(at: location) else { return nil }
guard let cell = self.tableView.cellForRow(at: indexPath) else { return nil }
let storyBoard = UIStoryboard(name: "Home", bundle: nil)
guard let previewViewController = storyBoard.instantiateViewController(withIdentifier: "article_page") as? ArticleViewController else { return nil }
previewViewController.preferredContentSize = CGSize(width: 0.0, height: 550)
previewViewController.passedValue = article_ids[(indexPath as NSIndexPath).row]
previewingContext.sourceRect = cell.frame
return previewViewController
} else {
guard let indexPath = self.tableView2.indexPathForRow(at: location) else { return nil }
guard let cell = self.tableView2.cellForRow(at: indexPath) else { return nil }
let storyBoard = UIStoryboard(name: "Home", bundle: nil)
guard let previewViewController = storyBoard.instantiateViewController(withIdentifier: "article_page") as? ArticleViewController else { return nil }
previewViewController.preferredContentSize = CGSize(width: 0.0, height: 550)
if indexPath.row == 0 {
previewViewController.passedValue = 1001
} else {
previewViewController.passedValue = weekly_article_id_[(indexPath as NSIndexPath).row - 1]
}
previewingContext.sourceRect = cell.frame
return previewViewController
}
以上方法无效。 (它可能是错误的实现导致它对我没有任何意义)。我也尝试了 this 解决方案,但它没有按预期工作。我正在寻找的是这样的东西:
if sourceView == tableView {
//first tableView implementation
} else {
//second tableView implementation
}
感谢任何帮助。在过去的 4 小时里,我一直在努力。
我可能会尝试注册一次预览,源视图只是您的视图:
registerForPreviewing(with: self, sourceView: self.view)
然后在你的previewingContext
方法中将这个点转换为每个tableView以确定它是哪一个:
let tableViewPoint = self.view.convert(location, to: self.tableView)
if let indexPath1 = self.tableView.indexPathForRow(at: tableViewPoint) {
// Point is within first table - get the cell at this indexPath and handle
}
else {
let tableViewPoint2 = self.view.convert(location, to: self.tableView2)
if let indexPath2 = self.tableView2.indexPathForRow(at: tableViewPoint2) {
// Point is within second table - get the cell at this indexPath and handle
}
}