如何在Objective-C中将NSView转换为NSTableView

时间:2019-06-06 23:21:54

标签: objective-c cocoa

我有一个NSTableView,它具有一个自定义NSTableViewCell的多个对象。 每个NSTableViewCell对象具有三个NSTextField。 我想在每个NSField中发送输入的文本,并将其分配给String变量。 问题是我需要获取超级视图对象以确定该自定义NSTableViewCell所在的selectedRow。

在Swift中可能看起来像这样:

let textField = sender as! NStextField
let myView = textField.superview?.superview?.superview as! NSTableView
let num = myView.row(for: textField.superview!)

我尝试过使用NSTextField之一:

- (IBAction)setValue:(id)sender {
    NSTableView *thisTable = self.cell.superview.superview.superview.superview;
    NSInteger num = [thisTable selectedRow];  
}

它不起作用,并且我也收到此警告:

  

使用不兼容的指针类型初始化“ NSTableView *”   'NSView * _Nullable'类型的表达式

我的CustomCell类是用于绘制单元格的简单类。

@implementation CustomCell
- (id)init {
    self = [super init];

    if(self != nil) {
        _cellTitle;
        _cellBackLight;
        _cellTime;

    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect { 
    [super drawRect:dirtyRect];
}

.h文件:

@interface CustomCell : NSTableCellView
@property NSString *cellTitle;
@property double cellValue;
@property int cellTime;
@property (strong) IBOutlet NSTextField *titleField;
@property (strong) IBOutlet NSTextField *valueField;
@property (strong) IBOutlet NSTextField *durationField; 
//All outlets are linked from Storyboard to the CustomCell class.
@end

tableView委托:

- (id)tableView:(NSTableView *)viewTableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex {
    NSTableCellView *cell = [viewTableView makeViewWithIdentifier:tableColumn.identifier owner:self];

    cell = [viewTableView makeViewWithIdentifier:@"MainCell" owner:self];
    return cell;
}

我要实现的目标: enter image description here

2 个答案:

答案 0 :(得分:1)

完全忘记了Objective C的语法,但这是在iOS的Swift中如何实现的。

免责声明:我很清楚iOS和MacOS开发之间存在许多差异,但这是“如何组织代码以实现此特定任务”的展示。即使它不是可复制/不可粘贴的,甚至没有经过测试,使用的方法也一样。

假设您拥有class Person

class Person {
    var title: String = ""
    var name: String = ""
    var surname: String = ""
}

您可以在ViewController中添加Person数组。 此数组绑定到您的tableView数据源,因此其中的Person实例显示在TableView中

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var personArray: [Person] = []

    // MARK:- TableViewDelegate
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return personArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath) as! CustomCell
        cell.person = personArray[indexPath.row] // - 1
        return cell
    }
}

您会注意到,该单元格现在包含对您要显示/编辑的关联人员的新引用person。 请参见下面的CustomCell实现:

class CustomCell: UITableViewCell, UITextFieldDelegate {

    weak var person: Person? { // the reference to the associated person
        didSet {
            // when Person is set, we update the fields 
            titleTextField.text = person?.title ?? ""
            nameTextField.text = person?.name ?? ""
            surnameTextField.text = person?.surname ?? ""
        }
    }

    @IBOutlet weak var titleTextField: UITextField!
    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var surnameTextField: UITextField!


    override func awakeFromNib() {
        super.awakeFromNib()

        // Add action when textField text change 
        titleTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
        nameTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
        surnameTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
    }

    @objc func textFieldDidChange(textField: UITextField){

        // switch on the textField to see which info should be edited 
        switch textField {
            case titleTextField:
                person?.title = titleTextField.text ?? ""
            case nameTextField:
                person?.name = nameTextField.text ?? ""
            case surnameTextField:
                person?.surname = surnameTextField.text ?? ""
            default: break
        }
    }
}

这样做,您对Person的修改将在关联的CustomCell中进行处理。 重新加载tableview后,它将保留您已经输入的数据 当您编辑TextField时,它将更改person并认为它是参考,您将在主VC上看到personArray的不同之处


再次不能复制/粘贴,应将其视为伪代码

答案 1 :(得分:1)

仅供参考,我发现了如何在自定义单元格表视图中获取所选行:

- (IBAction)name:(id)sender {
    NSInteger num = [_viewTableView selectedRow];
    NSLog(@"thisTable selectedRow %ld", (long)num);
}