Ios 试图从Objective-C转换为Swift VC
我想从objective-c转到swift 但是,当我使用下面的对象尝试此操作时,我收到以下错误 我不知道我做错了什么,我在故事板上设置了segue,并将其分配给相同的ID,创建了prepare函数和perform函数Ios 试图从Objective-C转换为Swift VC,ios,objective-c,swift,segue,uistoryboardsegue,Ios,Objective C,Swift,Segue,Uistoryboardsegue,我想从objective-c转到swift 但是,当我使用下面的对象尝试此操作时,我收到以下错误 我不知道我做错了什么,我在故事板上设置了segue,并将其分配给相同的ID,创建了prepare函数和perform函数 - (void)renderer:(id<SCNSceneRenderer>)renderer willRenderScene:(SCNScene *)scene atTime:(NSTimeInterval)time { // Look for track
- (void)renderer:(id<SCNSceneRenderer>)renderer willRenderScene:(SCNScene *)scene atTime:(NSTimeInterval)time {
// Look for trackables, and draw on each found one.
size_t trackableCount = trackableIds.size();
for (size_t i = 0; i < trackableCount; i++) {
// NSLog(@"this is the variable value: %d", trackableIds[i]);
// Find the trackable for the given trackable ID.
ARTrackable *trackable = arController->findTrackable(trackableIds[i]);
// SCNCamera *camera = self.cameraNode.camera;
SCNNode *trackableNode = self.trackableNodes[i];
if (trackable->visible) {
if (trackableIds[i] == 0) {
NSLog(@"Starbucks");
[self performSegueWithIdentifier:@"brandSegue" sender:self];
} else if (trackableIds[i] == 1) {
NSLog(@"Dortios");
}
} else {
trackableNode.opacity = 0;
}
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"brandSegue"]) {
JSONViewController *destViewController = segue.destinationViewController;
}
}
在聊天中讨论并解决各种问题后,我将逐一解决:
> *** Assertion failure in -[UIApplication _cachedSystemAnimationFenceCreatingIfNecessary:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3698.21.8/UIApplication.m:1707
> *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'accessing _cachedSystemAnimationFence requires the main thread'
这是导致崩溃的第一个问题。这是关于需要在主线程中调用CocoaTouch的内部方法
问题在于您的性能与标识符:发件人:
有关。所有与UI相关的调用都必须在主线程中完成。
要解决此问题,请执行以下操作:
dispatch_async(dispatch_get_main_queue(), ^(){
[self performSegueWithIdentifier:@"brandSegue" sender:self];
});
修复此问题后发现了第二个问题:
它会分离,但会触发两次,你知道为什么会发生这种情况吗
您正在这样做:
for (size_t i = 0; i < trackableCount; i++)
{
if (somethingTest)
{
[self performSegueWithIdentifier:@"brandSegue" sender:self];
}
}
下一期,将数据传递到目标ViewController:
JSONViewController *destViewController = segue.destinationViewController;
destViewController.brand = @"something";
您正在混合使用Swift和Objective-C,因为XCode抱怨不知道brand
是JSONViewController
对象的属性,所以需要在声明var之前添加@objc
。可以找到更详细的答案
最后,将您的数据传递给循环的技巧是使用发送方(它在编码方面比创建另一个var等更快):
我想更安全的方法是使用navigationController?.pushViewController(uu:animated:),而不是使用segues。以及控制台中的任何错误消息?控制台中显示的完整错误是什么?@Larme我已经更新了我的问题。
dispatch\u async(dispatch\u get\u main\u queue(),^(){[self performagewithidentifier:@“brandSegue”sender:self];})相反,您正在执行for循环:for(size\u t i=0;i
。您可能需要添加一个中断代码>结束它,不是吗?或者您是否需要检查所有这些值(因为在if(trackableIds[i]==1)
中,您还需要做其他事情?)如果您需要检查所有值,只需添加一个BOOL needTobrandSegue=FALSE
在循环之前,如果==0,则将其设置为TRUE,如果需要,在循环之后执行segue。
//Declare a var before the for loop
BOOL seguedNeedsToBeDone = FALSE;
for (size_t i = 0; i < trackableCount; i++)
{
if (somethingTest)
{
seguedNeedsToBeDone = TRUE;
}
}
//Perform the segue after the for loop if needed
if (seguedNeedsToBeDone)
{
[self performSegueWithIdentifier:@"brandSegue" sender:self];
}
JSONViewController *destViewController = segue.destinationViewController;
destViewController.brand = @"something";
//Calling the performSegue with custom value to pass
[self performSegueWithIdentifier:@"brandSegue" sender:someVarToSend];
//Passing the custom value
destViewController.brand = someVarToSend;