我遇到UITableView问题 问题是当我运行SidePanelViewController时没有显示任何内容。我错过了什么?我没有收到任何错误,只是一个空的桌面视图。
这是我的代码
class SidePanelViewController : BackgroundViewController {
var delegate: SidePanelViewControllerDelegate?
@IBOutlet weak var profileImageView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var name2Label: UILabel!
@IBOutlet weak var menuTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
profileImageView.sd_setImageWithURL(NSURL(string: Me.read(Me.Key.profileImage) as! String))
nameLabel.text = Me.read(Me.Key.displayName) as? String
name2Label.text = Me.read(Me.Key.displayName2) as? String
let adapter = SidePanelTableAdapter(sidePanels: Constants.menu)
adapter.tableView = menuTableView
menuTableView.delegate = adapter
menuTableView.dataSource = adapter
menuTableView.reloadData()
}
}
我创建了一个名为SidePanelTableAdapter的新类,实现了UITableViewDataSource和UITableViewDelegate
class SidePanelTableAdapter: NSObject {
var tableView: UITableView!
var sidePanels: [SidePanel]
var total = 0
init(sidePanels: [SidePanel]) {
self.sidePanels = sidePanels
total = sidePanels.count
print ("total \(total)")
}
}
extension SidePanelTableAdapter: UITableViewDelegate {
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
if isExpanded[indexPath.row] {
}
}
}
extension SidePanelTableAdapter: UITableViewDataSource {
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("count \(self.total)")
return self.total
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
print("ih wow")
let row = indexPath.row
let cell = tableView
.dequeueReusableCellWithIdentifier("SidePanelTableViewCell", forIndexPath: indexPath) as! SidePanelTableViewCell
cell.navImageView.sd_setImageWithURL(NSURL(string: sidePanels[row].iconUrl))
cell.navTitle.text = sidePanels[row].name
print("get \(cell)")
return cell
}
}
我有8个数据。为了确保,我打印数据numberOfRowsInSection,
在日志中输出是正确的 - > “伯爵8”。
但是没有调用cellForRowAtIndexPath。再次确保我用该方法打印文本 - > “哇哇”。但是“哇哇”没有出现在日志中。
有什么想法吗? 谢谢。
答案 0 :(得分:3)
你这么说:
let adapter = SidePanelTableAdapter(sidePanels: Constants.menu)
adapter.tableView = menuTableView
menuTableView.delegate = adapter
menuTableView.dataSource = adapter
menuTableView.reloadData()
现在想想代码结束时会发生什么。 adapter
是局部变量,是局部变量中的SidePanelTableAdapter对象。代码结束,本地变量被销毁,和SidePanelTableAdapter被销毁。因此,您将看到一个没有SidePanelTableAdapter的视图(表视图)来控制它。您的SidePanelTableAdapter代码永远不会运行,因为您的SidePanelTableAdapter 不存在。
这里你想要做的就是将adapter
分配到SidePanelViewController的属性中,以便它持续。
答案 1 :(得分:0)
确定。我只是解决了这个问题,感谢@Matt提供的信息。 喜欢亚光说。在调用viewDidLoad()方法之后销毁适配器。
所以我改变了我的代码
- (void)viewDidLoad {
[super viewDidLoad];
//have a property named label
self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
[_label setText:@"LABEL"];
[_label setBackgroundColor:[UIColor redColor]];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setFrame:CGRectMake(0, 0, 100, 50)];
[button addTarget:self action:@selector(tapDown) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(tapCancel) forControlEvents:UIControlEventTouchUpInside];
[button addTarget:self action:@selector(tapCancel) forControlEvents:UIControlEventTouchUpOutside];
[self.view addSubview:button];
[button addSubview:_label];
}
-(void)tapDown{
_label.backgroundColor=[UIColor blueColor];
}
-(void)tapCancel{
_label.backgroundColor=[UIColor redColor];
}
到此:
class SidePanelViewController : BackgroundViewController {
var delegate: SidePanelViewControllerDelegate?
@IBOutlet weak var profileImageView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var name2Label: UILabel!
@IBOutlet weak var menuTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
profileImageView.sd_setImageWithURL(NSURL(string: Me.read(Me.Key.profileImage) as! String))
nameLabel.text = Me.read(Me.Key.displayName) as? String
name2Label.text = Me.read(Me.Key.displayName2) as? String
let adapter = SidePanelTableAdapter(sidePanels: Constants.menu)
adapter.tableView = menuTableView
menuTableView.delegate = adapter
menuTableView.dataSource = adapter
menuTableView.reloadData()
}
}
也许是因为我之前是Android开发人员,而iOS中的新用户仍然使用java的模式。 我想我应该从你身上学到更多东西。 谢谢大家。