如何滚动警报控制器中的操作? Xcode 8 个,Swift 3 个,IOS
How to scroll through actions in alert controller? Xcode 8, Swift 3, IOS
请帮忙! :) 我是这里的大菜鸟。我从各种来源收集了这段代码,所以我真的不知道自己在做什么。我的警报控制器显示 a textfield that I can write in, a 'cancel' action, an 'ok' action, and it also displays multiple 'input keyword to label' actions.
It has so many actions (around 20 keyword actions that i need) that it either doesn't fit in the screen, it is covered by the keyboard, or it is in the way of the keyboard. 外观丑陋,有些按键不能触摸。有没有办法滚动浏览我的操作以使其适合此 space?
这是我对最后一张图片的代码:
//Quality Text Box (9)
@IBOutlet weak var QualityLabel: UILabel!
@IBAction func QualityTapped(_ sender: UIButton) {
print("Quality Button Tapped")
openQualityAlert()
}
func openQualityAlert() {
//Create Alert Controller
let alert9 = UIAlertController (title: "Quality:", message: nil, preferredStyle: UIAlertControllerStyle.alert)
//Create "Keyword -> label" actions
let bt1 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Abuse"}
alert9.addAction(bt1)
let bt2 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Hemmorhage"}
alert9.addAction(bt2)
let bt3 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Discomfort"}
alert9.addAction(bt3)
let bt4 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Acute"}
alert9.addAction(bt4)
let bt5 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Disease"}
alert9.addAction(bt5)
let bt6 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Rash"}
alert9.addAction(bt6)
let bt7 = UIAlertAction(title: "Itch", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Itch"}
alert9.addAction(bt7)
let bt8 = UIAlertAction(title: "Burn", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Burn"}
alert9.addAction(bt8)
let bt9 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Abuse"}
alert9.addAction(bt9)
let bt10 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Hemmorhage"}
alert9.addAction(bt10)
let bt11 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Discomfort"}
alert9.addAction(bt11)
let bt12 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Acute"}
alert9.addAction(bt12)
let bt13 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Disease"}
alert9.addAction(bt13)
let bt14 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Rash"}
alert9.addAction(bt14)
let bt15 = UIAlertAction(title: "Itch", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Itch"}
alert9.addAction(bt15)
let bt16 = UIAlertAction(title: "Burn", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Burn"}
alert9.addAction(bt16)
let bt17 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Abuse"}
alert9.addAction(bt17)
let bt18 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Hemmorhage"}
alert9.addAction(bt18)
let bt19 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Discomfort"}
alert9.addAction(bt19)
let bt20 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Acute"}
alert9.addAction(bt20)
let bt21 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Disease"}
alert9.addAction(bt21)
let bt22 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Rash"}
alert9.addAction(bt22)
//Create Cancel Action
let cancel9 = UIAlertAction(title: "CANCEL", style: UIAlertActionStyle.cancel, handler: nil)
alert9.addAction(cancel9)
//Create OK Action
let ok9 = UIAlertAction(title: "INPUT TEXTFIELD", style: UIAlertActionStyle.default) { (action: UIAlertAction) in print("OK")
let textfield = alert9.textFields?[0]
print(textfield?.text!)
self.QualityLabel.text = textfield?.text!
}
alert9.addAction(ok9)
//Add Text Field
alert9.addTextField { (textfield: UITextField) in
textfield.placeholder = "Quality"
}
//Present Alert Controller
self.present(alert9, animated:true, completion: nil)
}
使用此代码
设置您的警报控制器class
虽然我找到了一种滚动到 UIAlertController 操作顶部的方法,
我不建议这样做,因为我不知道你的应用是否会被拒绝。
我认为这个答案只适用于 iOS 10+
self.present(alert, animated: true, completion: {
//print(alert.view) // _UIAlertControllerView
//print(alert.view.subviews) // [UIView]
//print(alert.view.subviews[0].subviews) // [_UIAlertControllerInterfaceActionGroupView]
//print(alert.view.subviews[0].subviews[0].subviews) // [_UIDimmingKnockoutBackdropView, UIView]
//print(alert.view.subviews[0].subviews[0].subviews[0].subviews) // [UIView, UIVisualEffectView]
//print(alert.view.subviews[0].subviews[0].subviews[1].subviews) // [_UIInterfaceActionGroupHeaderScrollView, _UIInterfaceActionItemSeparatorView_iOS, _UIInterfaceActionRepresentationsSequenceView]
// _UIInterfaceActionRepresentationsSequenceView <- This is what we want
// In this view are all your added actions. It is a subview of UIScrollView, so just cast it and set the contentOffset to zero
if let scrollView = alert.view.subviews[0].subviews[0].subviews[1].subviews[2] as? UIScrollView {
scrollView.setContentOffset(.zero, animated: true)
}
})
有时这可能不起作用,因为我不检查子视图是否按此顺序。
未来的 iOS 更新也可能使此方法完全崩溃。
另外我刚刚在 iPhone 上测试了这个。我不知道它是否适用于 iPad。
一种或多或少安全的方式(欢迎提出建议):
self.present(alert, animated: true, completion: {
guard alert.view.subviews.count >= 1 else { return }
guard alert.view.subviews[0].subviews.count >= 1 else { return }
guard alert.view.subviews[0].subviews[0].subviews.count >= 2 else { return }
guard alert.view.subviews[0].subviews[0].subviews[1].subviews.count >= 3 else { return }
if let scrollView = alert.view.subviews[0].subviews[0].subviews[1].subviews[2] as? UIScrollView {
scrollView.setContentOffset(.zero, animated: true)
}
})
这会找到 scrollView 并滚动到顶部。我们搜索所有的子视图,因为不止一个子视图响应setContentOffset,但是不用去检查是哪个。
- (void)methodThatCreatesTheAlertController
{
// make the alertController here, add actions, and then...
[self presentViewController:alertController animated:YES completion:^{
[self scrollToTopOfAlertControllerView:alertController.view];
}];
}
- (void)scrollToTopOfAlertControllerView:(UIView *)view
{
for ( UIView *aSubview in view.subviews ) {
if ( [aSubview respondsToSelector:@selector(setContentOffset:animated:)] ) {
// _UIInterfaceActionGroupHeaderScrollView
// _UIInterfaceActionRepresentationsSequenceView <-- this is the one that scrolls
[((UIScrollView *)aSubview) setContentOffset:CGPointZero animated:YES];
}
[self scrollToTopOfAlertControllerView:aSubview]; // recurse
}
}
请帮忙! :) 我是这里的大菜鸟。我从各种来源收集了这段代码,所以我真的不知道自己在做什么。我的警报控制器显示 a textfield that I can write in, a 'cancel' action, an 'ok' action, and it also displays multiple 'input keyword to label' actions.
It has so many actions (around 20 keyword actions that i need) that it either doesn't fit in the screen, it is covered by the keyboard, or it is in the way of the keyboard. 外观丑陋,有些按键不能触摸。有没有办法滚动浏览我的操作以使其适合此 space?
这是我对最后一张图片的代码:
//Quality Text Box (9)
@IBOutlet weak var QualityLabel: UILabel!
@IBAction func QualityTapped(_ sender: UIButton) {
print("Quality Button Tapped")
openQualityAlert()
}
func openQualityAlert() {
//Create Alert Controller
let alert9 = UIAlertController (title: "Quality:", message: nil, preferredStyle: UIAlertControllerStyle.alert)
//Create "Keyword -> label" actions
let bt1 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Abuse"}
alert9.addAction(bt1)
let bt2 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Hemmorhage"}
alert9.addAction(bt2)
let bt3 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Discomfort"}
alert9.addAction(bt3)
let bt4 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Acute"}
alert9.addAction(bt4)
let bt5 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Disease"}
alert9.addAction(bt5)
let bt6 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Rash"}
alert9.addAction(bt6)
let bt7 = UIAlertAction(title: "Itch", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Itch"}
alert9.addAction(bt7)
let bt8 = UIAlertAction(title: "Burn", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Burn"}
alert9.addAction(bt8)
let bt9 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Abuse"}
alert9.addAction(bt9)
let bt10 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Hemmorhage"}
alert9.addAction(bt10)
let bt11 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Discomfort"}
alert9.addAction(bt11)
let bt12 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Acute"}
alert9.addAction(bt12)
let bt13 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Disease"}
alert9.addAction(bt13)
let bt14 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Rash"}
alert9.addAction(bt14)
let bt15 = UIAlertAction(title: "Itch", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Itch"}
alert9.addAction(bt15)
let bt16 = UIAlertAction(title: "Burn", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Burn"}
alert9.addAction(bt16)
let bt17 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Abuse"}
alert9.addAction(bt17)
let bt18 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Hemmorhage"}
alert9.addAction(bt18)
let bt19 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Discomfort"}
alert9.addAction(bt19)
let bt20 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Acute"}
alert9.addAction(bt20)
let bt21 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Disease"}
alert9.addAction(bt21)
let bt22 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Rash"}
alert9.addAction(bt22)
//Create Cancel Action
let cancel9 = UIAlertAction(title: "CANCEL", style: UIAlertActionStyle.cancel, handler: nil)
alert9.addAction(cancel9)
//Create OK Action
let ok9 = UIAlertAction(title: "INPUT TEXTFIELD", style: UIAlertActionStyle.default) { (action: UIAlertAction) in print("OK")
let textfield = alert9.textFields?[0]
print(textfield?.text!)
self.QualityLabel.text = textfield?.text!
}
alert9.addAction(ok9)
//Add Text Field
alert9.addTextField { (textfield: UITextField) in
textfield.placeholder = "Quality"
}
//Present Alert Controller
self.present(alert9, animated:true, completion: nil)
}
使用此代码
设置您的警报控制器class虽然我找到了一种滚动到 UIAlertController 操作顶部的方法,
我不建议这样做,因为我不知道你的应用是否会被拒绝。
我认为这个答案只适用于 iOS 10+
self.present(alert, animated: true, completion: {
//print(alert.view) // _UIAlertControllerView
//print(alert.view.subviews) // [UIView]
//print(alert.view.subviews[0].subviews) // [_UIAlertControllerInterfaceActionGroupView]
//print(alert.view.subviews[0].subviews[0].subviews) // [_UIDimmingKnockoutBackdropView, UIView]
//print(alert.view.subviews[0].subviews[0].subviews[0].subviews) // [UIView, UIVisualEffectView]
//print(alert.view.subviews[0].subviews[0].subviews[1].subviews) // [_UIInterfaceActionGroupHeaderScrollView, _UIInterfaceActionItemSeparatorView_iOS, _UIInterfaceActionRepresentationsSequenceView]
// _UIInterfaceActionRepresentationsSequenceView <- This is what we want
// In this view are all your added actions. It is a subview of UIScrollView, so just cast it and set the contentOffset to zero
if let scrollView = alert.view.subviews[0].subviews[0].subviews[1].subviews[2] as? UIScrollView {
scrollView.setContentOffset(.zero, animated: true)
}
})
有时这可能不起作用,因为我不检查子视图是否按此顺序。
未来的 iOS 更新也可能使此方法完全崩溃。
另外我刚刚在 iPhone 上测试了这个。我不知道它是否适用于 iPad。
一种或多或少安全的方式(欢迎提出建议):
self.present(alert, animated: true, completion: {
guard alert.view.subviews.count >= 1 else { return }
guard alert.view.subviews[0].subviews.count >= 1 else { return }
guard alert.view.subviews[0].subviews[0].subviews.count >= 2 else { return }
guard alert.view.subviews[0].subviews[0].subviews[1].subviews.count >= 3 else { return }
if let scrollView = alert.view.subviews[0].subviews[0].subviews[1].subviews[2] as? UIScrollView {
scrollView.setContentOffset(.zero, animated: true)
}
})
这会找到 scrollView 并滚动到顶部。我们搜索所有的子视图,因为不止一个子视图响应setContentOffset,但是不用去检查是哪个。
- (void)methodThatCreatesTheAlertController
{
// make the alertController here, add actions, and then...
[self presentViewController:alertController animated:YES completion:^{
[self scrollToTopOfAlertControllerView:alertController.view];
}];
}
- (void)scrollToTopOfAlertControllerView:(UIView *)view
{
for ( UIView *aSubview in view.subviews ) {
if ( [aSubview respondsToSelector:@selector(setContentOffset:animated:)] ) {
// _UIInterfaceActionGroupHeaderScrollView
// _UIInterfaceActionRepresentationsSequenceView <-- this is the one that scrolls
[((UIScrollView *)aSubview) setContentOffset:CGPointZero animated:YES];
}
[self scrollToTopOfAlertControllerView:aSubview]; // recurse
}
}