Как я уже упоминал в своих комментариях, я считаю, что читать построчно проще:
record = 0
results = []
for line in CLI_Output.split("\n"):
# skip empty lines
if line == "" and record < 2:
continue
# if Router Link is in header
if line.find('Router Link') > -1:
record = 1
continue
# headers
if record == 1:
record = 2
continue
# If we are here, we are getting the data lines
if record == 2 and line != "":
results.append(line)
elif line == "":
record = 0 # use break here if you want to stop after the first chunk
print(results)
Результаты:
['10.189.7.250 10.189.7.250 1102 0x80012fa1 0x6b32 2',
'10.200.254.252 10.200.254.252 97 0x80000003 0x00501E 3',
'10.189.127.3 10.189.127.3 1707 0x80001d5e 0xa509 1',
'10.189.254.242 10.189.254.242 10 0x80001ce0 0x8ec2 1',
'10.189.7.250 10.189.7.250 1102 0x80012fa1 0x6b32 2',
'10.189.254.243 10.189.254.243 1552 0x80001ce8 0x164e 1']
Хотя это не означает, что с помощью регулярных выражений это невозможно, но это более сложно, например, честно трудно понять смысл нижеприведенного, если вы не привыкли к синтаксису:
^\ +(.+) Router Link States\s*(?:\([^)]+\))?\s+Link ID.+\s+((?:[^\r\n]+[\r\n]?)+)
[ 119] regex101 demo
Код Ивата у меня не работает. Но это работает.
- (void)willTransitionToState:(UITableViewCellStateMask)state { [super willTransitionToState:state]; if ((state & UITableViewCellStateShowingDeleteConfirmationMask) == UITableViewCellStateShowingDeleteConfirmationMask) { for (UIView *subview in self.subviews) { if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) { subview.hidden = YES; subview.alpha = 0.0; } } } } - (void)didTransitionToState:(UITableViewCellStateMask)state { [super didTransitionToState:state]; if (state == UITableViewCellStateShowingDeleteConfirmationMask || state == UITableViewCellStateDefaultMask) { for (UIView *subview in self.subviews) { if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) { UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0]; CGRect f = deleteButtonView.frame; f.origin.x -= 20; deleteButtonView.frame = f; subview.hidden = NO; [UIView beginAnimations:@"anim" context:nil]; subview.alpha = 1.0; [UIView commitAnimations]; } } } }
Для меня лучший способ решить эту проблему - это переопределить -(void)layoutSubviews
в MyCell:UITableViewCell
. Здесь вы можете увидеть не только пользовательскую позицию кнопки «Удалить», но также изменить положение элементов управления «Редактировать» и «Изменить порядок» для . Режим редактирования
- (void)layoutSubviews
{
[super layoutSubviews];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.0f];
for (UIView *subview in self.subviews) {
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
CGRect newFrame = subview.frame;
newFrame.origin.x = 200;
subview.frame = newFrame;
}
else if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]) {
CGRect newFrame = subview.frame;
newFrame.origin.x = 100;
subview.frame = newFrame;
}
else if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellReorderControl"]) {
CGRect newFrame = subview.frame;
newFrame.origin.x = 200;
subview.frame = newFrame;
}
}
[UIView commitAnimations];
}
Мне не удалось изменить фактический вид кнопки удаления, но вы можете изменить текст. Возможно, вы можете использовать это, чтобы получить эффект, который вы ищете?
Проверьте следующий член протокола UITableViewDelegate
:
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
Кроме того, вы можете определить, когда кнопка удаления отображается путем подкласса UITableViewCell
и переопределения следующего:
- (void)willTransitionToState:(UITableViewCellStateMask)state
- (void)didTransitionToState:(UITableViewCellStateMask)state
Для любого из них маска состояния будет UITableViewCellStateShowingDeleteConfirmationMask
, когда отображается кнопка удаления.
Надеюсь, эти подсказки укажут вам правильное направление.
Я не знаю, как "переместить кнопку удаления на 10 пикселей влево". Однако вы можете анимировать пользовательское содержимое ячейки таблицы вокруг статического положения неподвижной кнопки удаления, прослушивая сообщение willTransitionToState:
из подкласса UITableViewCell
, см. здесь .
Чтобы процитировать документы:
Подклассы UITableViewCell могут реализовать этот метод для анимации дополнительных изменений в ячейке, когда она меняет состояние. UITableViewCell вызывает этот метод всякий раз, когда ячейка переходит между состояниями, например, из нормального состояния (по умолчанию) в режим редактирования. Пользовательская ячейка может устанавливать и позиционировать любые новые виды, которые появляются с новым состоянием. Затем ячейка получает сообщение layoutSubviews (UIView), в котором она может расположить эти новые представления в их окончательных местоположениях для нового состояния. Подклассы всегда должны вызывать super при переопределении этого метода.
То, что вы ищете, это значение UITableViewCellStateShowingDeleteConfirmationMask
. Это один из тех случаев, когда создание подкласса UITableViewCell может быть лучше, поэтому из контроллера вы просто создаете экземпляр своей пользовательской ячейки. Тогда ячейка может просто настроить себя, как animateLeft
и animateRight
, и обработать внутреннюю работу по настройке своих собственных подпредставлений.
Я не знаю окончательного решения, но поскольку я попробовал следующий код, то он может оказаться полезным.
// subclass UITableViewCell
- (void)willTransitionToState:(UITableViewCellStateMask)state
{
[super willTransitionToState:state];
if ((state & UITableViewCellStateShowingDeleteConfirmationMask) == UITableCellStateShowingDeleteConfirmationMask)
{
for (UIView *subview in self.subviews)
{
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"])
{
subview.hidden = YES;
subview.alpha = 0;
}
}
}
}
- (void)didTransitionToState:(UITableViewCellStateMask)state
{
[super willTransitionToState:state];
if ((state & UITableViewCellStateShowingDeleteConfirmationMask) == UITableCellStateShowingDeleteConfirmationMask)
{
for (UIView *subview in self.subviews)
{
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"])
{
subview.frame = CGRectMake(subview.frame.origin.x - 10, subview.frame.origin.y, subview.frame.size.width, subview.frame.size.height);
subview.hidden = NO;
[UIView beginAnimations:@"anim" context:nil];
subview.alpha = 1;
[UIView commitAnimations];
}
}
}
}