根据设备/特性将UITableView.Style设置为.insetGrouped

6

我想在iPad上或基于大小变化特征上使用新的iOS 13表格视图样式.insetGrouped

遗憾的是,无法在初始化后更改UITableView样式:https://developer.apple.com/documentation/uikit/uitableview/style

在Storyboard中进行更改也不可行,因为没有办法根据尺寸类别进行更改。

我目前正在使用此代码,但没有任何变化:

class DetailViewController: UITableViewController {

    []

    override init(style: UITableView.Style) {

        if UIDevice.current.userInterfaceIdiom == .pad {
            super.init(style: .insetGrouped)
        } else {
            super.init(style: style)
        }
    }


    // Xcode forced me to include this as well?
    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
}

嗨@alexkaessner。你搞清楚如何完成这个任务了吗? - SAHM
很遗憾,目前我只是在界面构建器中使用旧的样式设置。 - alexkaessner
如果您有一个故事板,则会调用init(coder:)初始化程序。 - Sulthan
@Sulthan 我尝试在 init(coder:) 中设置 self.tableView = UITableView(frame: self.tableView.frame, style: .insetGrouped),但启动时会崩溃。 - alexkaessner
@alexkaessner,你不能这样做。你要么在你的storyboard/xib中设置样式,要么在创建table view controller时使用init(style:)来设置样式。这些方法不能混合使用。你不能在创建后更改表格样式,这意味着你不能更改从storyboard加载的控制器的表格样式。 - Sulthan
2个回答

1
创建UIViewController,使用`

`。
var tableView: UITableView!
init(...) {
    if ??? {
        self. tableView = UITableView(style:...)
    } else {
        self. tableView = UITableView(style:anotherStyle)
    }
    self.tableView.dataSource = self
    self.tableView.delegate = self
}

`


我尝试在init(coder:)中设置self.tableView = UITableView(frame: self.tableView.frame, style: .insetGrouped),但是启动时会崩溃。 - alexkaessner
使用CGRect.zero作为框架并将其添加到视图层次结构中,然后在下一行中添加约束。您具有递归引用。 self.tableView = ..(frame:self.tableView.frame..... - WAMii

0

目前唯一有效的方法在维护方面可能很糟糕,但至少可以为用户实现您想要的效果:只需制作故事板的副本并调整style属性。完成后,根据设备或任何要使用的标准加载正确的故事板:

var resource = "StoryboardName"

if UIDevice.current.userInterfaceIdiom == .pad {
    resource += "Large"
}

let storyboard = UIStoryboard(name: resource, bundle: nil)

这确实不是理想的情况!也许我会等到可以放弃旧操作系统或仅从Storyboard转换到代码。 - alexkaessner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接