2017-08-06 69 views
6

我不明白我的代码有什么问题。我只是用“Ok”按钮显示一个提醒,当用户点击“确定”时,然后提醒。但它并没有消失。使用Swift3进行编程。 viewDidAppear()是否可以放这个代码?或者我做错了什么?UIAlertController不会消失

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert)   
    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 
    present(alertController, animated: true, completion: nil) 
} 

UPDATE: 当我把在其他控制器相同的代码,它的工作。 在原控制器中,在viewDidLoad(),我有一个Async调用如下。这是因为这个问题吗?

DispatchQueue.global(qos: .background).async { 
    self.getDetails(onCompletion: {(json: JSON) in 

    let dict = self.convertToDictionary(text: json.stringValue) 

     DispatchQueue.main.async { 

      self.activityIndicator.stopAnimating() 
      UIApplication.shared.endIgnoringInteractionEvents() 

      //Other UI update operation 

     } 
    }) 
}  

我也覆盖viewWillDisappear()viewWillAppear(),只需设定屏幕的标题。

+0

你的代码是好的,正确的,以及它完美的我 –

+0

奇怪的工作。这不适合我。 :( – NGR

+0

清理并运行一次 –

回答

1

viewDidAppear()添加下面的代码之前警报代码,并开始工作。我一直在下面的代码在两个位置,即在Async通话以及在viewDidAppear()

self.activityIndicator.stopAnimating() 
UIApplication.shared.endIgnoringInteractionEvents() 
-2

您的代码看起来很好,而且viewDidAppear没问题,因为您的视图控制器将被正确加载,并且不会破坏主线程以向您显示警报。你的代码应该存在一些其他问题,(Xcode的错误)或派生数据问题。

你可以做几件事情要看到实际的问题:

  1. 清洁从导出的数据
  2. 删除应用程序建立
  3. 删除文件从模拟器
  4. 清洁再次
  5. 重新启动Xcode和模拟器
  6. 重建以查看它是否有效。
+0

:(....仍然没有工作 – NGR

+0

虽然这会有所帮助,它不是一个真正的答案是可能会更好过上帮助OP缩小问题的范围问题的注释。 – Abizern

+1

@Abizern,你是对的,但是我怎样才能在格式正确的评论中写出整个答案?我已经阅读了很多其他答案,但仍然只包含一行建议以上任何内容,并且人们也接受或赞同他们。在这里,因为这个原因我收到了一个倒退。 – Hemang

5

你打电话UIApplication.shared.beginIgnoringInteractionEvents() 任何地方兄弟?如果是的,那是你的问题。

+0

是的。我已经在该控制器中确保用户在加载时不能点击UI。但是我也有UIApplication.shared.endIgnoringInteractionEvents()在viewDidLoad()中的异步调用中结束它。警报代码在viewDidAppear() – NGR

+0

我也认为这是问题,请参阅您在后台使用队列,因此它有一个低优先级来完成。这也将补充您的活动指示器在屏幕上时可以显示警报的事实。 –

+0

我的建议是,(我假设你真的只想在加载时读取你的json,并且希望在显示屏幕时触发警报,即使它在返回中也是如此)将呼叫置于特定功能中提醒并在endignoring和viewdidappear之后在viewdidload中调用它。创建一个变量作为一个标志来控制警报是否被viewdidload调用,因此不应该被viewdidappear调用。 –

0

endIgnoringInteractionEvents()当您单击OK时,该方法处于异步方法,此方法尚未被调用。所以你不能解雇警报。

1

如果我们创建一个新的“单一视图”项目 用于呈现警报有以下两种方式,我们得到以下行为

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert) 
     alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 
     present(alertController, animated: true, completion: nil) 
    } 

在控制台,你会看到

2017- 08-15 16:27:35.871测试[66719:7754741]警告:尝试呈现其视图不在窗口层次中的视图!

并且在UI上没有提示。

和:

override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     let alertController = UIAlertController(title: "Wrong Item", message: "Could not find details of an item.", preferredStyle: .alert) 
     alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 
     present(alertController, animated: true, completion: nil) 
    } 

每一件事情按预期工作。

所以是的,视图确实出现的地方。

关于viewDidLoad()viewDidAppear(_:)

从它的问题在于 beginIgnoringInteractionEvents

如果你把你的警报上viewDidAppear你应该看到它,但如果你不看长相它请注意以下几点:

即使你把这段代码放在viewdidload

 DispatchQueue.main.async { 

      self.activityIndicator.stopAnimating() 
      UIApplication.shared.endIgnoringInteractionEvents() 

      //Other UI update operation 

     } 

它可能会在以后执行(取决于当解析完成上)比viewDidAppear 呼叫,这是因为:

DispatchQueue.global(QOS:系统技术领域) .async

你检查这个原因?