2013-11-27 2 views
0

У меня есть то, что я считаю простым требованием. У меня есть контроллер табличного представления, и ячейки заполняются информацией о Core Data. Это работает. Теперь я хочу извлечь информацию из cell.textLabel.text в cellForRowAtIndexPath в строку, которую я в конечном итоге буду использовать для создания PDF-файла.Store cell.textLabel.text в NSString

Чтобы поместить это в перспективе, у меня есть кнопка навигационной панели, которая создает PDF:

- (IBAction)generatePDFbuttonPressed:(id)sender 
{ 
    pageSize = CGSizeMake(612, 792); 
    NSString *fileName = @"new.pdf"; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *pdfFileName = [documentsDirectory stringByAppendingPathComponent:fileName]; 

    [self generatePdfWithFilePath:pdfFileName]; 
} 

Это вызывает:

- (void) generatePdfWithFilePath: (NSString *)thefilePath 
{ 
    UIGraphicsBeginPDFContextToFile(thefilePath, CGRectZero, nil); 
    BOOL done = NO; 
    do 
    { 
     //Start a new page. 
     UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil); 

     //Draw text fo our header. 
     [self drawHeader]; 

     //Draw some text for the page. 
     [self drawText]; 

     //Draw an image 
     [self drawImage]; 
     done = YES; 
    } 
    while (!done); 

    // Close the PDF context and write the contents out. 
    UIGraphicsEndPDFContext(); 
} 

Это вызывает метод DrawText:

- (void)drawText 
{ 
    CGContextRef currentContext = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(currentContext, 0.0, 0.0, 0.0, 1.0); 

    NSString *textToDraw = @"Hello, this is a test"; 

    UIFont *font = [UIFont systemFontOfSize:14.0]; 

    CGSize textSize = CGSizeMake(pageSize.width - 5*kBorderInset-5*kMarginInset, pageSize.height - 5*kBorderInset - 5*kMarginInset); 

    CGRect renderingRect = CGRectMake(kBorderInset + kMarginInset, kBorderInset + kMarginInset + 50.0, pageSize.width - 2*kBorderInset - 2*kMarginInset, textSize.height); 

    [textToDraw drawWithRect:renderingRect options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil]; 
} 

Это рисует PDF со словами «Привет», это текст. Это хорошо. Но не то, что я хочу.

Каждая ячейка извлекает информацию из Core Data для заполнения textLabel и detailTextLabel. Названия заголовков и заголовков контроллера также достигаются с помощью fetchedResultsController, который выполняет fetchRequest в Entity для получения этой информации. Это работает.

Что я хочу сделать сейчас, это взять значение cell.textLabel.text, поместить его в строку и использовать в методе drawText.

Я создал fetchRequest в методе DrawText:

NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 

NSFetchRequest *pdfFetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext]; 
pdfFetchRequest.entity = entity; 

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"dates.dateOfEvent" ascending:NO]; 

pdfFetchRequest.sortDescriptors = [NSArray arrayWithObject:sort]; 
pdfFetchRequest.fetchBatchSize = 20; 

pdfFetchRequest.predicate = [NSPredicate predicateWithFormat:@"whoBy = %@", self.person]; 

NSError *error = nil; 
NSArray *types = [managedObjectContext executeFetchRequest:pdfFetchRequest error:&error]; 

NSString *textToDraw = [NSString stringWithFormat:@"Information = %@", types]; 

Если я создаю строку с массивом типов, он показывает мне необработанные основные данные в файле PDF. Это доказывает, что он работает. Однако это не является удобочитаемым человеком.

В cellForRow простой NSLog (@ "% @", cell.textLabel.text) показывает правильную информацию в журнале.

Теперь я хочу сохранить эту информацию в строку, передать ее методу drawText и использовать эту строку для отображения информации в файле PDF с помощью вызова NSString в методе drawText.

Это сводит меня с ума, и я не могу найти ни одного решения, чего я хочу достичь; если кто-то может помочь с этим, я был бы чрезвычайно благодарен!

В двух словах, в основном то, что я хочу сделать, это:

WHATEVER Retrieve хранится в cell.textLabel.text и cell.detailTextLabel.text и что сохранены в строку, так что я могу назвать, что из моего метода drawText.

Если это не будет работать с PDF-файлами, могу ли я отправить электронную почту из таблицы. Мне как-то нужно ОБРАТИТЬ все, что находится в этом представлении таблицы (включая не видимые ячейки) - будь то создание PDF-файла, отправка по электронной почте или любой другой механизм. Я здесь, в реальной потере!

Спасибо!

ответ

1

Результат запроса выборки - это массив управляемых объектов, поэтому у вас есть , чтобы перебрать этот массив и «нарисовать» нужную информацию.Например

NSArray *types = [managedObjectContext executeFetchRequest:pdfFetchRequest error:&error]; 
for (Transaction *trans in types) { 
    NSString *name = trans.name; // Assuming that there is a "name" property 
    NSString *otherProperty = trans.otherProperty; // just an example 
    NSString *textToDraw = [NSString stringWithFormat:@"name = %@, other property = %@", name, otherProperty]; 
    // now draw it to the PDF context 
} 

Таким образом, вы должны получить данные от «модели» (контроллер надуманных результатов в данном случае) и не с «точки зрения» (вид таблицы ячеек).

+0

Спасибо, Мартин - это безумно полезно и проверив его, он работает как шарм с несколькими незначительными зацепками. 1) (глупый вопрос), но как я могу сгенерировать каждый набор на другой строке? Таким образом, в приведенном выше коде имя и другое свойство работают очень хорошо, но когда есть две записи, как я могу получить каждый новый набор имен и другого свойства, сгенерированного на отдельной строке? 2) Должен ли я пропустить fetchRequest, созданный в drawText, и просто использовать fetchedResultsController (который делает то же самое fetchRequest)? .. если да, то как бы назвать это в этом методе drawRect? - Еще раз спасибо Martin – amitsbajaj

+0

@amitsbajaj: 1) 'renderRect' определяет, где текст нарисован, так что вы могли бы, например, increment 'renderingRect.origin.y' на какую-то сумму для новой строки. 2) Контроллер выбранных результатов используется в качестве источника данных для представления таблицы. В этом случае правильный запрос выборки правилен. –

+0

Спасибо @Martin - снова супер полезно. Я рассмотрю проблему renderRect - спасибо Мартину. Еще раз. Жизнь спасателя! – amitsbajaj

Смежные вопросы