【问题标题】:Issue passing data to iOS UIViewController将数据传递给 iOS UIViewController 的问题
【发布时间】:2021-06-18 14:10:36
【问题描述】:

我试图将枚举传递给另一个故事板中的UIViewController,但错误是UIViewController 没有成员ViewType。当我在强制! 后检查变量类型时,它仍然是UIViewController 而不是QuotesTestmoniesViewController

为什么变量的类型没有被更改为新的视图控制器类型?我在这里做错了什么?

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    
    var viewController = UIViewController()
    
    switch indexPath.item {
    //Saints
    case 0:
        viewController = self.amiStoryboard.instantiateViewController(withIdentifier: "militarysaintscontroller") as! SaintsViewController
        self.navigationController?.pushViewController(viewController, animated: true)
    //Prayers
    case 1:
        break;
    //Testmonies
    case 2:
        break;
    //Quotes
    case 3:
        viewController = self.amiStoryboard.instantiateViewController(withIdentifier: "militaryquotestestmoniescontroller") as! QuotesTestmoniesViewController
        viewController.viewType = ViewType.Quotes //ERROR
        self.navigationController?.pushViewController(viewController, animated: true)
    default:
        return
    }
}

【问题讨论】:

  • 试试这个:(viewController as? QuotesTestmoniesViewController).viewType = ViewType.Quotes
  • 是的,它似乎正在工作。但是为什么第一次没有改变类型呢?这是一个错误还是什么?
  • 你不必像那样把代码写得乱七八糟

标签: swift casting uiviewcontroller


【解决方案1】:

看起来您正在尝试使用单行来推送不同的视图控制器。

但在代码中,您也编写了适用于所有情况的推送线。

它不会通过转换值和分配来工作。您必须在传递数据时强制转换控制器。像这样

(viewController as? QuotesTestmoniesViewController).viewType = ViewType.Quotes

您可以制作一个通用函数来像这样推送视图控制器

func pushNextViewController<T: UIViewController>(viewController: T) {
   self.navigationController?.pushViewController(viewController, animated: true)
}

用法:

let viewController = self.amiStoryboard.instantiateViewController(withIdentifier: "militaryquotestestmoniescontroller") as! QuotesTestmoniesViewController
      viewController.viewType = ViewType.Quotes
pushNextViewController(viewController: viewController)

//----

let viewController2 = self.amiStoryboard.instantiateViewController(withIdentifier: "militarysaintscontroller") as! SaintsViewController
pushNextViewController(viewController: viewController2)

【讨论】:

  • 我喜欢这里的通用函数用法。我在 switch 语句之后调用了一次函数。
【解决方案2】:

T 类型的变量可以保存 T 类型的值。如果您使用将 T 转换为 U 的表达式进行赋值之类的操作,则无关紧要。仍然是 T 类型的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2019-03-16
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多