【问题标题】:Within UIViewController class, @IBOutlet self.tableView is nil在 UIViewController 类中,@IBOutlet self.tableView 为 nil
【发布时间】:2016-01-18 14:09:37
【问题描述】:

我有一个 UIViewController (FiltersViewController),在故事板中包含 2 个组件,UITableView 和 UIStackView,如下所示:

class FiltersViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet var tableView: UITableView! // PROBLEM: this is nil

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView // is always nil
    }

    func someFunc() {
        self.tableView // is always nil
    }
}

我将FiltersViewController.view 添加到当前 UIViewController 如下:

class CurrentViewController: UIViewController {

    let floatingView: UIView = UIView()
    var filtersViewController = FiltersViewController()

    override func viewDidLoad() {
        super.viewDidLoad()

        floatingView.frame = CGRectMake(-201, 0, 270, 270)
        floatingView.clipsToBounds = false
        self.view.addSubview(floatingView)

        floatingView.addSubview(filtersViewController.view)
    }
}

如果我只将 FiltersViewController 更改为 UITableViewController 的子类,它就可以工作,如下所示:

class FiltersViewController: UITableViewController {

但是,此更改的另一个问题,Stack View 丢失了

关于我可能做错的任何想法。

【问题讨论】:

  • 是的,我已经仔细检查过,现在上传截图
  • 为什么要使用UIViewController 添加子视图而不是子类化UIView(或任何其他对象)然后将控制器添加到当前视图控制器?
  • @PabloA。我最终得到了类似的东西,摆脱了UIViewController

标签: ios objective-c swift uitableview uiviewcontroller


【解决方案1】:

这里有问题:var filtersViewController = FiltersViewController()。您需要通过将 nib 传递给 init 方法来初始化控制器。

更改属性声明,

var filtersViewController: FiltersViewController?

要从情节提要加载,您应该在 viewDidLoad 中执行此操作

filtersViewController = storyboard?.instantiateViewControllerWithIdentifier("YourFilterViewControllerIdentifier")
floatingView.addSubview(filtersViewController.view)

【讨论】:

  • 我遇到了同样的问题,但它给了我一个错误“无法将 UIViewController 的值分配给 UITableViewController”,尽管我的视图是 UIViewController
  • @MurtazaKhursheedHussain 这是因为在您的Storyboard 中您放置了UITableViewController 实例,而不是UIViewController
【解决方案2】:

我最终在 xib 中创建了单独的 UIView(与 main.storyboard 分开),并实例化如下:

let filtersView = UINib(nibName: "Filters", bundle: NSBundle(forClass: self.dynamicType)).instantiateWithOwner(self, options: nil)

视图实例化后,添加为子视图

floatingView.addSubview(filtersView)

@IBOutlet's 相互连接,并且像魅力一样工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多