![](/img/trans.png)
[英]iOS App works fine with Simulator but Crashes with a real iOS device
[英]app works fine in Simulator (Xcode 7.1.1) but not on iOS device
我有一个可以计算两个日期之间差异的应用程序。 它可以在Simulator中正常运行,但不能在iOS设备(使用iOS 9的iPad)上运行。
当我按下iPad上的“计算差异”按钮时,没有任何反应。 在Xcode的调试区域中,我收到以下错误消息:
2015-11-16 08:33:32.246日期至日期计算器[369:64113]
<CATransformLayer: >0x17eb95e0>
-更改仅转换图层中的属性masksToBounds,将不会产生任何效果2015-11-16 08:33 :32.250日期至日期计算器[369:64113]
<CATransformLayer: 0x17d8ea30>
-更改>仅转换图层中的属性masksToBounds,将无效2015-11-16 08:33:32.251日期至日期计算器[369:64113]
<CATransformLayer: 0x17d95830>
-更改>仅转换图层中的属性maskToBounds无效
我已经在SO上搜索了此内容,但找不到解决方案。
有没有人有什么建议?
谢谢!
请在下面找到View Controller代码:
import UIKit
类ViewController:UIViewController {
@IBOutlet weak var startDateTextField: UITextField!
@IBOutlet weak var endDateTextField: UITextField!
@IBOutlet weak var resultNumberOfDays: UILabel!
@IBOutlet weak var resultWeeksAndDays: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor(red: 210/255, green: 213/255, blue: 220/255, alpha: 1.0)
let toolBar = UIToolbar(frame: CGRectMake(0, self.view.frame.size.height/6, self.view.frame.size.width, 40.0))
toolBar.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0)
toolBar.barStyle = UIBarStyle.BlackTranslucent
toolBar.tintColor = UIColor.whiteColor()
UIToolbar.appearance().barTintColor = UIColor(red: 0/255, green: 0/255, blue: 205/255, alpha: 1.0)
let todayBtn = UIBarButtonItem(title: "Today", style: UIBarButtonItemStyle.Plain, target: self, action: "tappedToolBarBtn:")
let okBarBtn = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "donePressed:")
// let okBarBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: "donePressed:")
let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil)
let label = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width / 3, height: self.view.frame.size.height))
label.font = UIFont(name: "Helvetica Neue", size: 13)
label.backgroundColor = UIColor.clearColor()
label.textColor = UIColor.whiteColor()
label.text = "Select a Start Date"
label.textAlignment = NSTextAlignment.Center
let textBtn = UIBarButtonItem(customView: label)
toolBar.setItems([todayBtn,flexSpace,textBtn,flexSpace,okBarBtn], animated: true)
startDateTextField.inputAccessoryView = toolBar
let toolBar2 = UIToolbar(frame: CGRectMake(0, self.view.frame.size.height/6, self.view.frame.size.width, 40.0))
toolBar2.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0)
toolBar2.barStyle = UIBarStyle.BlackTranslucent
toolBar2.tintColor = UIColor.whiteColor()
UIToolbar.appearance().barTintColor = UIColor(red: 0/255, green: 0/255, blue: 205/255, alpha: 1.0)
let todayBtn2 = UIBarButtonItem(title: "Today", style: UIBarButtonItemStyle.Plain, target: self, action: "secondTappedToolBarBtn:")
let okBarBtn2 = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "secondDonePressed:")
// let okBarBtn2 = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: "secondDonePressed:")
let flexSpace2 = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil)
let label2 = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width / 3, height: self.view.frame.size.height))
label2.font = UIFont(name: "Helvetica Neue", size: 13)
label2.backgroundColor = UIColor.clearColor()
label2.textColor = UIColor.whiteColor()
label2.text = "Select an End Date"
label2.textAlignment = NSTextAlignment.Center
let textBtn2 = UIBarButtonItem(customView: label2)
toolBar2.setItems([todayBtn2,flexSpace2,textBtn2,flexSpace2,okBarBtn2], animated: true)
endDateTextField.inputAccessoryView = toolBar2
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func donePressed(sender: UIBarButtonItem) {
startDateTextField.resignFirstResponder()
}
func secondDonePressed(sender: UIBarButtonItem) {
endDateTextField.resignFirstResponder()
}
func tappedToolBarBtn(sender: UIBarButtonItem) {
let dateformatter = NSDateFormatter()
dateformatter.dateStyle = NSDateFormatterStyle.MediumStyle
dateformatter.timeStyle = NSDateFormatterStyle.NoStyle
startDateTextField.text = dateformatter.stringFromDate(NSDate())
startDateTextField.resignFirstResponder()
}
func secondTappedToolBarBtn(sender: UIBarButtonItem) {
let dateformatter = NSDateFormatter()
dateformatter.dateStyle = NSDateFormatterStyle.MediumStyle
dateformatter.timeStyle = NSDateFormatterStyle.NoStyle
endDateTextField.text = dateformatter.stringFromDate(NSDate())
endDateTextField.resignFirstResponder()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
}
@IBAction func textFieldEditing(sender: UITextField) {
let datePickerView: UIDatePicker = UIDatePicker()
datePickerView.datePickerMode = UIDatePickerMode.Date
sender.inputView = datePickerView
datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
}
@IBAction func secondTextFieldEditing(sender: UITextField) {
let datePickerView: UIDatePicker = UIDatePicker()
datePickerView.datePickerMode = UIDatePickerMode.Date
sender.inputView = datePickerView
datePickerView.addTarget(self, action: Selector("secondDatePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
}
func datePickerValueChanged(sender: UIDatePicker) {
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle
startDateTextField.text = dateFormatter.stringFromDate(sender.date)
}
func secondDatePickerValueChanged(sender: UIDatePicker) {
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle
endDateTextField.text = dateFormatter.stringFromDate(sender.date)
}
@IBAction func calculateDays(sender: UIButton) {
if startDateTextField.text! == "" || endDateTextField! == "" {
let alert2 = UIAlertController(title: "Oops!", message: "Please Select a Start Date!", preferredStyle: UIAlertControllerStyle.Alert)
alert2.addAction(UIAlertAction(title: "Close", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert2, animated: true, completion: nil)
}
else {
let start = String(startDateTextField.text!)
let end = String(endDateTextField.text!)
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
guard let startDate = dateFormatter.dateFromString(start), endDate = dateFormatter.dateFromString(end) else {
// You don't have dates, show error(print("error"), do no nothing - your choice.
return
}
// let startDate:NSDate = dateFormatter.dateFromString(start)!
// let endDate:NSDate = dateFormatter.dateFromString(end)!
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: [])
let secondNewString = "\(components.day) days"
resultNumberOfDays.text = secondNewString
}
}
@IBAction func calculateWeeksAndDays(sender: UIButton) {
if startDateTextField.text! == "" || endDateTextField! == "" {
let alert2 = UIAlertController(title: "Oops!", message: "Please Select an End Date!", preferredStyle: UIAlertControllerStyle.Alert)
alert2.addAction(UIAlertAction(title: "Close", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert2, animated: true, completion: nil)
}
else {
let start = String(startDateTextField.text!)
let end = String(endDateTextField.text!)
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
guard let startDate = dateFormatter.dateFromString(start), endDate = dateFormatter.dateFromString(end) else {
// You don't have dates, show error(print("error"), do no nothing - your choice.
return
}
// let startDate:NSDate = dateFormatter.dateFromString(start)!
// let endDate:NSDate = dateFormatter.dateFromString(end)!
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: [])
let days = components.day
let weeks = components.day / 7
let weeksanddays = days % 7
let newString = "\(weeks) weeks + \(weeksanddays) days"
resultWeeksAndDays.text = newString
}
}
@IBAction func resetLabels(sender: AnyObject) {
resultNumberOfDays.text = ""
resultWeeksAndDays.text = ""
}
}
我敢打赌,就目前而言,您的代码即使在模拟器中也无法“正常运行”。 例如,当我第一次点击文本字段时,日期选择器不会显示。 我必须在背景屏幕上点击才能重新签名FirstResponder,然后再次在文本字段上点击以显示日期选择器。
那里的问题是,直到文本字段成为第一响应者之后 ,您才实例化日期选择器并将其连接到文本字段,您需要在成为第一响应者之前进行此操作。 (例如,在viewDidLoad方法中。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.