我有一个导航控制器,它的根视图控制器是类型CollectionViewControllerA
.在选择一个项目后,我有一个淡出和扩展动画,然后调用将第二个类型的视图控制器CollectionVewControllerB
推入堆栈:
CollectionViewControllerB *b = ... // construction of the view controller to be pushed
[UIView animateWithDuration:.3
animations:^{
self.collectionView.transform = CGAffineTransformMakeScale(1.5, 1.5);
self.collectionView.alpha = 0;
}
completion:^(BOOL s){
[self.navigationController pushViewController:b animated:NO];
}];
Run Code Online (Sandbox Code Playgroud)
我以类似的方式弹出视图控制器
[UIView animateWithDuration:.3
animations:^{
self.collectionView.transform = CGAffineTransformMakeScale(.3, .3);
self.collectionView.alpha = 0;
}
completion:^(BOOL s){
[self.navigationController popViewControllerAnimated:NO];
}];
Run Code Online (Sandbox Code Playgroud)
这里的问题是弹出视图控制器时应用程序崩溃.原因:
*** -[CollectionViewControllerB scrollViewDidScroll:]: message sent to deallocated instance
Run Code Online (Sandbox Code Playgroud)
我知道问题是因为弹出的视图控制器被破坏了,但为什么scrollViewDidScroll:
首先调用它?没有改变contentOffset
的collectionView
代码,并没有用户交互无论是.除非更改transform
属性也会触发调用方法?
CollectionViewControllerB
实现,scrollViewDidScroll:
因为我需要禁用垂直滚动.
同时我有一个非常凌乱的黑客来防止崩溃,那是在动画之前,我补充说
self.collectionView.delegate = nil;
Run Code Online (Sandbox Code Playgroud)
这会阻止方法被调用.但必须有更好的方法.
任何人都可以阐明为什么 …
crash uiscrollview uinavigationcontroller ios uicollectionview
我试图使用标准UIRefreshControl
和UISearchController
上一个UITableViewController
.然而,它看起来并不像它应该做的那样.刷新时,滚动会使导航栏留下一个大的空白区域,大概应该是微调器的位置:
我在GitHub上有一个示例项目.以下是控件的设置方法:
override func viewDidLoad() {
super.viewDidLoad()
let spinner = UIRefreshControl()
spinner.addTarget(self, action: #selector(refresh), for: .valueChanged)
refreshControl = spinner
searchController = UISearchController(searchResultsController: nil)
navigationItem.searchController = searchController
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试将刷新控件分配给属性UITableView
而不是一个on UITableViewController
,这没有什么区别.
有人遇到过同样的问题吗?
我刚刚发现Swift的private
访问修饰符是文件级别,如"访问级别"下的文档中所规定的:
Swift中的私有访问与大多数其他语言中的私有访问不同,因为它的范围是封闭的源文件而不是封闭的声明.这意味着类型可以访问在与自身相同的源文件中定义的任何私有实体,但如果扩展在单独的源文件中定义,则扩展无法访问该类型的私有成员.
所以这意味着当类型在同一个文件中时,下面的代码将被编译:
class FirstType {
private var privateProperty: String = ""
}
class SecondType {
private let firstType = FirstType()
func messWithFirstType() {
firstType.privateProperty = "" // this compiles and works!
}
}
Run Code Online (Sandbox Code Playgroud)
据我所见,这完全破坏了封装.另一方面,为了便于阅读,将一些相关类型组合在同一个文件中可能会很好,特别是如果相关类型很小,如枚举.
私有扩展是一个例外,因为它们扩展了文件要包含的相同类型.私有扩展确实带来了一些不错的东西.
除了促进私有扩展之外,还有任何其他原因使文件范围private
访问修饰符在Swift中吗?
在我的应用程序启动时,它以编程方式显示使用segue的LoginViewController.视图控制器以模态方式呈现,过渡设置为交叉溶解.验证成功后,我想通过以编程方式触发展开segue来关闭登录视图.所以我把它添加到我的头文件中:
- (IBAction)unwindSegue:(UIStoryboardSegue *)segue;
Run Code Online (Sandbox Code Playgroud)
现在在IB中,我可以控制 - 从"文件所有者"LoginViewController拖动到"退出"按钮并选择unwindSegue:
.这将创建一个手动segue,它会在Connections检查器中显示File文件所有者和Exit按钮.然后我点击IB中场景中新创建的Unwind segue,然后给它起一个名字.如果我单击"转到"按钮进行展开segue操作,它会转到上面提到的声明.
到目前为止一切顺利,我在GCD块中成功验证后触发了这个解开segue:
....
dispatch_async(dispatch_get_main_queue(), ^
{
[self performSegueWithIdentifier:@"UnwindSegueIdentifier" sender:self];
[self.spinner removeFromSuperview];
self.spinner = nil;
});
Run Code Online (Sandbox Code Playgroud)
.....并且当它运行时没有任何反应.微调器确实被正确删除,但没有迹象表明unwind segue正在执行.
执行中的断点unwindSegue:
永远不会被击中.没有抛出任何错误.什么都没有写入控制台.标识符是正确的,我三重检查(否则它将失败).
我做了什么,虽然注意到,是Xcode认为unwindSegue:
是不挂钩:
我无法从前面的小空圈拖动并将其unwindSegue:
链接到"退出"按钮.
任何帮助将不胜感激.
ios ×3
crash ×1
ios11 ×1
objective-c ×1
segue ×1
swift ×1
uiscrollview ×1
uistoryboard ×1
uitableview ×1