今天的扩展程序在按钮事件(iOS)后显示“无法加载”

时间:2016-08-09 14:04:05

标签: ios swift uitableview today-extension

早上好!

我的iOS小部件中存在“无法加载”问题。我已经阅读了很多关于“无法加载”的消息,但没有解决我的问题。我不确定,但我认为我的问题是在更改内容后刷新小部件。

我的小部件有一个按钮和一个标签。如果用户按下按钮,标签中的文本将会更改 - 此时窗口小部件显示“无法加载”。按下按钮后只需一毫秒。

import UIKit
import NotificationCenter

class TodayViewController: UIViewController, NCWidgetProviding {

    @IBOutlet var segment_att: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)) {

        completionHandler(NCUpdateResult.NewData)
    }

    func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets {
        return UIEdgeInsetsZero
    }

    @IBAction func button_ae(sender: AnyObject) {
       let tableviewclass = TodayTableViewController()
       tableviewclass.newData()
    }

}

重要的是标签显示在TableViewController的TableViewCell中。所以TableViewController嵌入在Container中的ViewController中......来自按钮的监听器调用TableViewController文件的newdata()方法。

import UIKit
import NotificationCenter

class TodayTableViewController: UITableViewController, NCWidgetProviding {

    @IBOutlet var table: UITableView!
    @IBOutlet var label1: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()
        init()
    }

    func init() {
        let meldung: String = "test"
        label1.text = meldung
    }

    func newData() {
        let meldung: String = "new test"
        label1.text = meldung
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }    

}

代码非常简单和基本 - 所以我想知道这个简单机制中的问题。我希望你能帮助我!

谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码假定在调用newData()时已设置label1,即使在调用构造函数之后也是如此。

请尝试使用此可选链接语法,如果属性为nil,则会悄然失败:

import UIKit
import NotificationCenter

class TodayTableViewController: UITableViewController, NCWidgetProviding {

    @IBOutlet var table: UITableView!
    @IBOutlet var label1: UILabel!

    var meldung: String = "test"     // <-- meldung is property

    override func viewDidLoad() {
        super.viewDidLoad()
        init()
    }

    func init() {
        label1?.text = melding       // <-- optional chaining
    }

    func newData() {
        melding = "new test"         // <-- set the class property
        label1?.text = meldung       // <-- optional chaining
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }    

}

而不是调用newData(),您可以改为设置 meldung 属性,例如:

tableviewclass.meldung = "new test"

因为您的viewDidLoad()将负责设置属性

中的UILabel文本