我进入了斯威夫特的世界,慢慢向前走......
我想要的是一个带有两个容器视图的UIViewController,每个容器视图都有自己的带有UITableView的UIViewController,可以从右侧容器的表中拖动一个表项,并将其放在左侧容器的桌子上。父UIViewController应该关心拖动操作的所有内容。
因此我在UIViewController上添加了一个长按手势识别器,并相应地连接它:
@IBAction func longPress(sender: UILongPressGestureRecognizer) {
switch(sender.state) {
case UIGestureRecognizerState.Began: startDragDrop(sender)
case UIGestureRecognizerState.Ended: endDragDrop(sender)
default: return
}
}
,其中
func startDragDrop(sender: UILongPressGestureRecognizer) {
var startPoint: CGPoint = sender.locationInView(self.structureElementContainer!.tableView)
var indexPath = self.structureElementContainer.tableView.indexPathForRowAtPoint(startPoint)!
println("startPoint: \(startPoint.x) \(startPoint.y)")
println("\(indexPath.section) \(indexPath.row)")
}
当长按表条目时," var startPoint"行:
2015-03-20 15:45:59.822 xxx.20[10274:18100886] -[UIView tableView]: unrecognized selector sent to instance 0x7a14fa90
2015-03-20 15:45:59.828 xxx.20[10274:18100886] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView tableView]: unrecognized selector sent to instance 0x7a14fa90'
这里出了什么问题?
非常感谢您的支持
[已添加23-mar-2015] 我现在尝试遵循Mundi的提示,但到目前为止没有成功。
这是父级的视图控制器片段,我在其中添加了两个容器的出口:
class xxxDetails: UIViewController {
@IBOutlet weak var viewTitle: UILabel!
@IBOutlet weak var aaaElementsContainer: UIView!
@IBOutlet weak var bbbStructureContainer: UIView!
@IBOutlet var gestureRecognizer: UILongPressGestureRecognizer!
var structureElementsController: StructureElementsController!
override func viewDidLoad() {
super.viewDidLoad()
}
容器每个都嵌入了一个UITableViewController:
class aaaElementsController: UITableViewController {...}
class bbbElementsController: UITableViewController {...}
我尝试在父UIViewController中为这些控制器创建一个Outlet,但没有成功。
我尝试在UITableViewController中创建一个属性,该属性引用自身,以便能够从父级访问它,但没有成功。
似乎我可能采取了错误的做法。所以我现在的问题是:当在父UIView中通过ContainerViews嵌入两个子UITableViewControllers时,如何正确访问这些子项,以便我能够在父级中进行手势识别,并且能够跟随拖动和放大器从一个孩子掉到另一个孩子?
答案 0 :(得分:0)
您的self.structureElementContainer
没有tableView
属性。据推测,该视图的控制器有一个。您必须重构以使主视图保持对控制器的引用,而不是视图。
答案 1 :(得分:0)
嗯,Mundi的回答没有直接解决我的问题,但是它让我走上了导致解决方案的一系列信息......; - )
我很惊讶事情可能很简单。我坚持认为我没有得到子视图控制器的有效句柄。但是,要获取这些句柄,您只需在viewDidLoad期间关注嵌入segue:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "aaaElementsSegue" {
aaaElementsController = segue.destinationViewController as AaaElementsController
}
}
之后,aaaElementsController有效并允许访问子视图中的表视图。
而且,对于第二个子视图也是如此,我现在能够处理这两个子视图之间的拖放。