我正在构建一个原生Apple Watch应用程序,并且在模拟器上它会很好地打印到控制台,但是当我在设备上运行时它永远不会这样做.这是预期的行为吗?
我有一个collectionViewController,我想显示一堆自定义的UICollectionViewCells,上面有一些标签.不幸的是,每当我尝试访问自定义UICollectionViewCell的标签时,它都会导致崩溃:
安慰
致命错误:无法打开Optional.None
窗口
Thread1:EXC_BAD_INSTRUCTION(代码= EXC_1386_INVOP,子代码= 0x0)
我正试图像这样访问标签:
cell.name.text = names[indexPath!.item]
Run Code Online (Sandbox Code Playgroud)
也许这来自我的插座标签是零?但是,寻找答案没有任何效果,因为我不确定添加的问题是什么?/!在我的代码中并没有真正帮助.
MyCustomUICollectionViewController
class ScrambledTextCollectionViewController: UICollectionViewController {
var names: String[] = ["Anna", "Alex", "Brian", "Jack"]
override func viewDidLoad() {
super.viewDidLoad()
// Register cell classes
self.collectionView.registerClass(MyCustomCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
}
override func numberOfSectionsInCollectionView(collectionView: UICollectionView?) -> Int {
return 1
}
override func collectionView(collectionView: UICollectionView?, numberOfItemsInSection section: Int) -> Int {
return names.count
}
override func collectionView(collectionView: UICollectionView?, cellForItemAtIndexPath indexPath: NSIndexPath?) -> UICollectionViewCell? {
var cell = collectionView?.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as MyCustomCollectionViewCell
cell.name.text …Run Code Online (Sandbox Code Playgroud) 我对如何最好地保存包含CloudKit中其他对象数组的对象感到困惑.
假设我有一个待办事项列表应用程序,它有不同的项目集合.我如何保存/获取整个项目集合?
我是否有一个Record类型的Collection,它有一个名为"Name"的String属性,然后是一个名为"Items"的引用列表属性?
我知道Record类型的Item需要有一个名为"Collection"的引用属性,因为CloudKit如何从子对象引用它的父对象.
我已设法使用以下代码保存没有任何Item实例的集合
func addCollection(collection: Collection!, completion: (error: NSError!) -> ()) {
if collection == nil
return
}
let collectionRecord = CKRecord(recordType: "Collection")
CollectionRecord.setObject(collection.name, forKey: "Name")
privateDB.saveRecord(collectionRecord) {
record, error in
dispatch_async(dispatch_get_main_queue()) {
completion(error: error)
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一个选项是在保存Collection时,循环遍历Item的所有实例并单独保存它们,它们的Reference Attribute to Collection在CloudKit端进行连接,但这似乎是太多的网络调用.
努力使我的应用程序在iPhone 5和较小的iPhone之前工作.很高兴要求iOS6并使用Autolayout因为它很好用.
但是,应用程序有4个按钮,可以定期交换位置,因此我为每个按钮分配一个与数组不同的位置,然后使用以下内容为动画设置动画:
[UIView animateWithDuration:0.5 animations:^{
button1.center = [[locations objectAtIndex:0] CGPointValue];
button2.center = [[locations objectAtIndex:1] CGPointValue];
button3.center = [[locations objectAtIndex:2] CGPointValue];
button4.center = [[locations objectAtIndex:3] CGPointValue];
}];
Run Code Online (Sandbox Code Playgroud)
这不适用于Autolayout.没有什么变化.我得到的最好的是它会动画到一个位置,然后立即回弹.
当我删除Autolayout但是所有的按钮都在较小的iPhone上被碾碎,并且由于我使用的是iPhone 5尺寸设置的点,它们最终会降低,将底部行放在屏幕上.我原来有来自Interface Builder的不同的CGPoint数字,但它们是"错误的",虽然我认为它们是"错误的",因为它们是Autolayout使用的数字.数组就这样你可以看到:
buttonLocations = [NSArray arrayWithObjects:
[NSValue valueWithCGPoint:CGPointMake(57, 523)],
[NSValue valueWithCGPoint:CGPointMake(109, 523)],
[NSValue valueWithCGPoint:CGPointMake(57, 471)],
[NSValue valueWithCGPoint:CGPointMake(109, 471)],
nil];
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个问题?为每个尺寸的设备设置不同的点似乎不是很有效.
已经声明,运行HKWorkoutSession的应用程序将拥有超过其他watchOS 2应用程序的特权,因此当用户查看他们的Apple Watch时,它将转到显示运行锻炼而不是表面的视图.
目前,在我的设备和模拟器上,情况并非如此.如果我开始HKWorkoutSession然后离开5分钟,然后与Apple Watch或Watch Simulator进行交互,它会呈现表盘.
如果我然后打开我的应用程序,它似乎已被冻结,而不是终止(这是我想象的其他应用程序).当我需要在query.updateHandler中收到响应时,UI将更新.此外,如果我将其设置为每次我的query.updateHandler收到新的HKQuantitySample时都会提供触觉反馈,那么它将会这样做,因此应用必须以某种形式在后台运行.
有没有人注意到这种行为,我做错了什么,或者期待我不该做的事情?
以下是我开始HKWorkoutSession的方法:
self.workoutSession = HKWorkoutSession(activityType: HKWorkoutActivityType.Other, locationType: HKWorkoutSessionLocationType.Indoor)
self.healthStore.startWorkoutSession(self.workoutSession) {
success, error in
if error != nil {
print("startWorkoutSession \(error)\n")
self.printLabel.setText("startWorkoutSession \(error)")
self.printLabel.setTextColor(UIColor.redColor())
}
Run Code Online (Sandbox Code Playgroud) 我有一个视图,需要iPad和iPhone版本之间的不同约束.
登录屏幕在iPhone上以及在iPad上的页面表中以全屏显示.由于尺寸的原因,UITextFields距离iPhone的右侧和左侧40像素,但我希望它们在iPad上为80像素.我将其设置为最终值大小类(w Regular,h Regular)的特定约束.
但是,因为此视图显示在页面表上,所以它不使用最终值大小类.理想情况下,我想"强制"视图使用大小类,而不是拥有一组iPhone/iPad约束和许多约束Outlets.
我正在关注"CloudKit最佳实践"WWDC关于添加订阅的讨论,这似乎在iOS10中有所改变.
下面的代码返回'Success!',但是我的'AllChanges'订阅从未出现在CloudKit仪表板上的订阅类型中.
我在Xcode 8 beta 6上.
let subscription = CKDatabaseSubscription(subscriptionID:"AllChanges")
let notificationInfo = CKNotificationInfo()
notificationInfo.shouldSendContentAvailable = true
subscription.notificationInfo = notificationInfo
let operation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: [])
operation.modifySubscriptionsCompletionBlock = {
(modifiedSubscriptions: [CKSubscription]?, deletedSubscriptionIDs: [String]?, error: Error?) -> Void in
if error != nil {
print(error!.localizedDescription)
} else {
print("Success!")
}
}
operation.qualityOfService = .utility
privateDatabase.add(operation)
Run Code Online (Sandbox Code Playgroud) 尝试制作一个小型点击游戏,你有一个正方形网格,需要按不同的顺序点击它们.偶尔这些方块会互相交换位置.
我想我需要将每个方块的位置放入一个数组中.然后,当需要移动时,从当前位置转到从阵列中随机选择的位置,然后删除阵列中的该位置,这样我就不会在同一个位置获得多个按钮.
不幸的是,我甚至无法移动UIButtons,更不用说在两个位置之间进行插值.
目前这将移动一个按钮:
-(IBAction)button:(id)sender
{
button.center = CGPointMake(200, 200);
}
Run Code Online (Sandbox Code Playgroud)
但我不希望它像那样工作,我希望它能像这样工作,但它不起作用:
if (allButtonsPressed == YES)
{
button.center = CGPointMake(200, 200);
}
Run Code Online (Sandbox Code Playgroud)
如果放置如下,它甚至不会移动:
-(void)viewDidLoad
{
[super viewDidLoad];
button.center = CGPointMake(200, 200);
}
Run Code Online (Sandbox Code Playgroud)
为清楚起见,按钮是通过Interface Builder添加的,所有这些情况在做其他事情时都有效,所以我猜UIButtons需要以特定的方式移动/动画?
ios ×4
swift ×3
autolayout ×2
cloudkit ×2
ios8 ×2
watchkit ×2
watchos-2 ×2
xcode ×2
apple-watch ×1
cgpoint ×1
ckreference ×1
healthkit ×1
ios10 ×1
objective-c ×1
size-classes ×1
uibutton ×1