当从 iOS 中的另一个故事板场景调用 viewController 时,表视图变得空白(加载或重建)

Posted

技术标签:

【中文标题】当从 iOS 中的另一个故事板场景调用 viewController 时,表视图变得空白(加载或重建)【英文标题】:Table view is getting blank(Loading or Rebuilding) when viewController called from another storyboard scene in iOS 【发布时间】:2017-09-13 06:28:15 【问题描述】:

我的应用包含社交提要页面。当我从另一个故事板场景调用 feed viewController 时,feed 页表变空。

下面提到的代码是从另一个故事板场景调用 feed viewController。

let feedPage: UIViewController =  UIStoryboard(name:"ActivityFeed",bundle:nil).instantiateInitialViewController()!
let window :UIWindow = UIApplication.shared.keyWindow!
window.rootViewController = feedPage

window.makeKeyAndVisible()

我从另一个故事板场景调用提要页面观察到的是提要页面正在重新创建,因此表格也正在重新创建。 当我在同一个故事板中切换不同的场景时,这个问题不会发生。 我是 ios 新手,如果有人有任何线索,请提供帮助。

Feed 页面 viewDidLoad 方法:

override func viewDidLoad() 
    super.viewDidLoad()
    //createTable()
    print("viewDidLoad:ActivityPage")
    facebookLoginHandler = FacebookLogin(controller: self)

    screenWidth = UIScreen.main.bounds.width
    screenHeight = UIScreen.main.bounds.height
    screenScale = UIScreen.main.scale
    if screenScale == 3
        screenScale = 2
    else if screenScale == 1
        screenScale = 1.23
    else if screenScale == 2
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad)
            screenScale = 1
        else
            screenScale = 2
        
    

    DispatchQueue.main.async 
        ActvityFeedNetwork.getActivityFeedFromServer(viewController: self)
    
    tableView.delegate = self
    tableView.dataSource = self

    if userLoggedIn 
        statusBarNotSignedIn.removeFromSuperview()
        navigationBar.topItem!.title = "Activity Feed"
    
    else 
        statusBarSignedIn.removeFromSuperview()
    
    effect = visualEffectView.effect
    visualEffectView.effect = nil
    visualEffectView.alpha = 0
    visualEffectView.backgroundColor = UIColor.black


【问题讨论】:

向我们展示 ActivityFeed VC 中的代码 我添加了 viewDidLoad 方法代码。请检查。 【参考方案1】:

如果您尝试设置 RootViewController 的使用:

didFinishLaunchingWithOptions 中的代码更新为

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    // Override point for customization after application launch.

    let window = UIWindow(frame: UIScreen.main.bounds)
    let feedPage: UIViewController =  UIStoryboard(name:"ActivityFeed",bundle:nil).instantiateInitialViewController()!
    window.rootViewController = feedPage

    window.makeKeyAndVisible()

    return true

那我做了什么改变?

let window = UIWindow(frame: UIScreen.main.bounds)

设置你错过的窗口框架:)

只需从另一个 VC 加载一个 VC:

如果您尝试从其他 VC 加载 ActivityFeed VC,则您不需要 设置应用程序的 rootView 控制器只需要

如果您是以模态方式展示 VC,那么,

    if let feedPage =  UIStoryboard(name:"ActivityFeed",bundle:nil).instantiateInitialViewController() 
        self.present(vc, animated: true, completion: nil)
    

如果你推的是 VC 那么

if let feedPage =  UIStoryboard(name:"ActivityFeed",bundle:nil).instantiateInitialViewController() 
      self.navigationController?.pushViewController(vc, animated: true)

根据您的需要放置上述任何代码并删除

让窗口:UIWindow = UIApplication.shared.keyWindow! window.rootViewController = feedPage

window.makeKeyAndVisible()

【讨论】:

@Mukesh Gami:请看答案 我必须在哪里添加这个函数“func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool” @mukesh-gami :这是设置应用程序的 rootViewController rootViewController 是当你启动应用程序时加载的初始视图控制器,以防你试图从另一个 VC 加载 viewController 然后你不要' t需要设置rootViewController @mukesh-gami :如果有帮助,请考虑接受答案 谢谢桑迪普。但我的问题是 ActivityFeed 中的表格视图正在重新创建。因此,它被空白了一段时间。【参考方案2】:

假设主视图场景,您正在从另一个故事板场景调用活动提要,因此将该主视图故事板场景设置为来自 x 代码的初始视图控制器 x-code->单击主视图控制器->侧控制台/类检查器->勾选是初始视图控制器。

制作根视图控制器无需添加代码

然后使用 segue 或呈现视图控制器从初始视图控制器切换到它工作的任何视图控制器。

【讨论】:

以上是关于当从 iOS 中的另一个故事板场景调用 viewController 时,表视图变得空白(加载或重建)的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个 UIViewController 之间共享一个故事板场景

Xcode:更改故事板场景中的视图类型

Objective-C UIScrollView 不滚动

IOS应用导航栏后退按钮

自动布局:在 TableViewCell 中排列两个 UILabel

如何将UITabBar嵌入故事板xcode中的另一个UITabBar