ios - 使用 View Controller 中的方法调用模态视图,该 View 在加载之前覆盖该 View Controller 的 View

标签 ios swift uiviewcontroller

我试图在我的 View 出现之前调用 HealthKit 授权函数,但它在 View 加载后一直出现,这不是我想要的。我也收到此错误:

Unbalanced calls to begin/end appearance transitions for .

(我假设错误告诉我我做的是错的,我知道这一点。)

问题

我究竟应该如何调用此函数才能使 HealthKit 授权对话框在加载之前覆盖 View Controller 的 View ?

class SummaryViewController: UIViewController {

//MARK: Properties
@IBOutlet weak var chart: CounterView!
@IBOutlet weak var scoreLabel: UILabel!
@IBOutlet weak var pieChart: CounterView!
@IBOutlet weak var dateLabel: UILabel!

var healthData = HealthData()
let counterView = CounterView()
var scoreInt = 0

let yesterday = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -1, toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))

func formatDate(date:NSDate) -> String {
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
    let dateString = dateFormatter.stringFromDate(date)

    return dateString
}

override func viewWillAppear(animated: Bool) {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    func healthKitAuth() {
        HealthData().authorizeHealthKit { (authorized,  error) -> Void in
            if authorized {
                print("HealthKit authorization received.")
                self.healthData.updateHealthCharacteristics()
                let seconds = 0.1
                let delay = seconds * Double(NSEC_PER_SEC)  // nanoseconds per seconds
                let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

                dispatch_after(dispatchTime, dispatch_get_main_queue(), {
                    self.scoreInt = Int(self.healthData.score)
                    self.scoreLabel.text = String(self.scoreInt)
                    self.counterView.counter = self.scoreInt
                    self.pieChart.counter = self.counterView.counter

                    let dateString = self.formatDate(self.yesterday!)
                    self.dateLabel.text = String(dateString)
                })
            }
            else
            {
                print("HealthKit authorization denied!")
                if error != nil {
                    print("\(error)")
                }
            }
        }
    }
    healthKitAuth()
}
}

最佳答案

您收到的警告是因为您在转换过程中调用转换。您不应尝试在 viewWillAppear 方法中显示 View Controller 。 (authorizeHealthKit 函数提供了一个 View Controller ...)

至于你想要什么......你需要在 View Controller 加载之前调用 authorizeHealthKit 函数。为此,您可能需要创建一个新的 View Controller ,该 Controller 除了检查 HealthKit 授权之外什么都不做,然后加载您的 View Controller 。

关于ios - 使用 View Controller 中的方法调用模态视图,该 View 在加载之前覆盖该 View Controller 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33907164/

相关文章:

iphone - 加载较小图像表示的最有效方法

c# - 在 Xamarin C# 中向 MKMapView 的边缘添加填充

iOS 在第一个 View Controller 中模糊 View

ios - Swift 导入模块文件仍然导致未声明的标识符编译器错误

ios - 为什么单击按钮时会出现 NSUnknownKeyException?

iphone - 在其他 View Controller 下面创建一个 View Controller

ios - Objective-C > TableView 和 ViewController 之间的 Segue

ios - 如何在 Core Data 谓词中转义问号 '?'

json - 如何在 swift 中使用 Object Mapper 将 JSON String 映射到模型类

ios - 是否可以将 iOS 7 UIViewController 转换(特别是交互)与 subview Controller 一起使用?