Ios 试图从Objective-C转换为Swift VC

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

我想从objective-c转到swift

但是,当我使用下面的对象尝试此操作时,我收到以下错误

我不知道我做错了什么,我在故事板上设置了segue,并将其分配给相同的ID,创建了prepare函数和perform函数

- (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(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;