У меня есть то, что я считаю простым требованием. У меня есть контроллер табличного представления, и ячейки заполняются информацией о 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) (глупый вопрос), но как я могу сгенерировать каждый набор на другой строке? Таким образом, в приведенном выше коде имя и другое свойство работают очень хорошо, но когда есть две записи, как я могу получить каждый новый набор имен и другого свойства, сгенерированного на отдельной строке? 2) Должен ли я пропустить fetchRequest, созданный в drawText, и просто использовать fetchedResultsController (который делает то же самое fetchRequest)? .. если да, то как бы назвать это в этом методе drawRect? - Еще раз спасибо Martin – amitsbajaj
@amitsbajaj: 1) 'renderRect' определяет, где текст нарисован, так что вы могли бы, например, increment 'renderingRect.origin.y' на какую-то сумму для новой строки. 2) Контроллер выбранных результатов используется в качестве источника данных для представления таблицы. В этом случае правильный запрос выборки правилен. –
Спасибо @Martin - снова супер полезно. Я рассмотрю проблему renderRect - спасибо Мартину. Еще раз. Жизнь спасателя! – amitsbajaj