Как преобразовать NSView в NSTableView в Objective-C - PullRequest
2 голосов
/ 07 июня 2019

У меня есть NSTableView, который имеет несколько объектов пользовательского NSTableViewCell.Каждый объект NSTableViewCell имеет три поля NSTextFields.Я хочу отправить введенный текст в каждое из полей NSFields и назначить его для переменной String.Проблема в том, что мне нужно получить объект superview, чтобы определить selectedRow, в котором существует этот пользовательский NSTableViewCell.

что-то может выглядеть так в 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 ]

1 голос
/ 10 июня 2019

Просто для справки, я узнал, как можно получить выбранную строку в пользовательском представлении таблицы ячеек:

- (IBAction)name:(id)sender {
    NSInteger num = [_viewTableView selectedRow];
    NSLog(@"thisTable selectedRow %ld", (long)num);
}
1 голос
/ 07 июня 2019

Полностью забыл синтаксис Objective C, но вот как вы можете добиться этого в Swift для iOS.

Отказ от ответственности: Мне хорошо известно, что между разработкой под iOS и MacOS есть много отличий, однако это демонстрация того, «как организовать свой код для решения этой конкретной задачи».Даже если он не копируется / вставляется, даже не тестируется, используемый метод остается тем же.

Допустим, у вас есть class Person:

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

Вы можете добавить массив Person в вашем ViewController.Этот массив привязан к вашему источнику данных 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.Когда таблица перезагружается, она сохраняет данные, которые вы уже ввели. Когда вы редактируете TextField, он изменит person и, считая его справочным, вы увидите разницу в вашем personArray на главном VC


Еще раз, он не копируется / вставляется и должен рассматриваться как псевдокод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...