Swift iOS: 在两个容器之间拖放失败
Swift iOS: Drag & Drop between two Containers fails
我正在进入Swift的世界,缓缓前行……
我想要的是一个带有两个容器视图的 UIViewController,每个容器视图都有自己的 UIViewController 和一个 UITableView,可以从右容器的 table,然后将其放在左侧容器的 table 上。 parent 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)")
}
当 long-clicking 在 table 条目上时,"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'
这里出了什么问题?
非常感谢您的支持
[2015 年 3 月 23 日添加]
我现在尝试按照 Mundi 的提示进行操作,但到目前为止没有成功。
这是 parent 的视图控制器片段,我在其中为两个容器添加了出口:
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 {...}
我试图在 parent UIViewController 中为这些控制器创建一个 Outlet,但没有成功。
我试图在引用自身的 UITableViewController 中创建一个 属性,以便能够从 parent 访问它,但没有成功。
看来我可能采用了错误的方法。所以现在的问题是:当通过 ContainerViews 在 parent UIView 中嵌入两个 child UITableViewControllers 时,我如何正确访问这些 children,以便我能够有手势parent 中的识别能够跟随从一个 child 到另一个的拖放?
您的 self.structureElementContainer
没有 tableView
属性。大概那个视图的 controller 有一个。您必须重构以使主视图保留对控制器的引用,而不是视图。
好吧,Mundi 的回复并没有直接解决我的问题,但它让我找到了导致解决方案的一系列信息...;-)
我很惊讶事情会这么简单。我一直坚持我没有获得子视图控制器的有效句柄这一事实。但是,要获得这些句柄,您只需要关心 viewDidLoad 期间的嵌入转场:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "aaaElementsSegue" {
aaaElementsController = segue.destinationViewController as AaaElementsController
}
}
之后,aaaElementsController 有效并允许访问子视图中的 table 视图。
而且,由于第二个子视图也是如此,我现在能够处理这两个子视图之间的拖放操作。
我正在进入Swift的世界,缓缓前行……
我想要的是一个带有两个容器视图的 UIViewController,每个容器视图都有自己的 UIViewController 和一个 UITableView,可以从右容器的 table,然后将其放在左侧容器的 table 上。 parent 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)")
}
当 long-clicking 在 table 条目上时,"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'
这里出了什么问题?
非常感谢您的支持
[2015 年 3 月 23 日添加] 我现在尝试按照 Mundi 的提示进行操作,但到目前为止没有成功。
这是 parent 的视图控制器片段,我在其中为两个容器添加了出口:
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 {...}
我试图在 parent UIViewController 中为这些控制器创建一个 Outlet,但没有成功。
我试图在引用自身的 UITableViewController 中创建一个 属性,以便能够从 parent 访问它,但没有成功。
看来我可能采用了错误的方法。所以现在的问题是:当通过 ContainerViews 在 parent UIView 中嵌入两个 child UITableViewControllers 时,我如何正确访问这些 children,以便我能够有手势parent 中的识别能够跟随从一个 child 到另一个的拖放?
您的 self.structureElementContainer
没有 tableView
属性。大概那个视图的 controller 有一个。您必须重构以使主视图保留对控制器的引用,而不是视图。
好吧,Mundi 的回复并没有直接解决我的问题,但它让我找到了导致解决方案的一系列信息...;-)
我很惊讶事情会这么简单。我一直坚持我没有获得子视图控制器的有效句柄这一事实。但是,要获得这些句柄,您只需要关心 viewDidLoad 期间的嵌入转场:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "aaaElementsSegue" {
aaaElementsController = segue.destinationViewController as AaaElementsController
}
}
之后,aaaElementsController 有效并允许访问子视图中的 table 视图。
而且,由于第二个子视图也是如此,我现在能够处理这两个子视图之间的拖放操作。