2010-03-31 41 views
5

Tôi đang tải một số văn bản trợ giúp từ một plist và hiển thị giống nhau ở dạng UILabels nằm trong UIScrollView. Phần mã sau:Ngắt dòng không hoạt động ở UILabel

UILabel *sectionDetailLabel = [[[UILabel alloc] initWithFrame:CGRectMake(34, myOriginForThisSection, 286, 20)] autorelease]; 
    sectionDetailLabel.backgroundColor = [UIColor clearColor]; 
    sectionDetailLabel.numberOfLines = 0; 
    sectionDetailLabel.font = [UIFont systemFontOfSize:12]; 
    sectionDetailLabel.textColor = [UIColor blackColor]; 
    sectionDetailLabel.textAlignment = UITextAlignmentLeft; 
    sectionDetailLabel.lineBreakMode = UILineBreakModeWordWrap; 

    [baseScrollView addSubview:sectionDetailLabel]; 

    [sectionDetailLabel setText:myStringForThisSection]; 
    [sectionDetailLabel sizeToFit]; 

Trong khi bất kỳ văn bản 'dài' là nhận được quấn thành nhiều dòng một cách chính xác, tôi không thể tự chèn thêm bất kỳ dòng-chia sử dụng xuống dòng '\ n' nhân vật trong 'myStringForThisSection '. Tôi chỉ thấy các ký tự '\' và 'n' được in trong UILabel ở bất kỳ nơi nào tôi muốn thay vào đó.

Tôi đã xem xét điều này và sự đồng thuận chung dường như là thiết lập numberOfLines thành 0, thiết lập lineBreakMode thành giá trị hợp lệ và gọi sizeToFit (hoặc thiết lập khung của UILabel dựa trên sizeWithFont :) nên làm. Tất cả những gì tôi dường như đang làm trong đoạn mã ở trên - và hoạt động hoàn hảo khi lắp các chuỗi dài không biết dài vào nhiều dòng trên UILabel. Vì vậy, những gì có thể bị thiếu ở đây?

Lưu ý: Tất cả các biến được sử dụng - baseScrollView, myStringForThisSection và myOriginForThisSection - được tải trước khi mã trên bắt đầu thực thi và hoạt động tốt.

+0

Nếu chuỗi xuất phát từ một nguồn bên ngoài, điều này sẽ xảy ra. Nếu nó được khai báo/tạo ra trong mã (thậm chí có thể trong một plist), dòng mới sẽ được mã hóa như vậy. Tuy nhiên, một dòng mới phải được theo sau bởi dấu cách, nếu dòng đó là một dòng trống. –

Trả lời

8

UILabel không giải thích trình tự thoát \ n. Bạn có thể chèn ký tự thực đại diện cho Carriage Return và/hoặc Feed Line. Tạo một char để giữ dòng mới của bạn và sau đó chèn nó.

unichar newLine = '\n'; 
NSString *singleCR = [NSString stringWithCharacters:&newLine length:1]; 
[myStringForThisSection insertString:singleCR atIndex:somePlaceIWantACR]; 

Miễn là myStringForThisSection của bạn có thể thay đổi, nên làm điều đó.

+0

Đã hoạt động! Cảm ơn rất nhiều. –

+0

Trả lại vận chuyển đã thoát, tức là '\ r', cũng hoạt động. Ít nhất là trong Swift 3, trên iOS 10+ – Chris

3

tôi gặp khó khăn với câu trả lời Scot Gustafson của trên trong XCode 4.3

Hãy thử điều này thay vì:

unichar chr[1] = {'\n'}; 
NSString *cR = [NSString stringWithCharacters:(const unichar *)chr length:1]; 

Sau đó, sử dụng trong mã một cái gì đó của bạn như thế này:

self.myLabel.text = [NSString stringWithFormat:@"First Label Line%@Second Label Line", cR]; 
+0

Đó là ... đã lâu rồi. Tuy nhiên, tôi có thể thấy giá trị của việc không sử dụng hướng dẫn loại "insertAtIndex", điều này luôn có thể nguy hiểm và đặc biệt khi bạn xử lý dữ liệu bằng nhiều ngôn ngữ khác nhau. Nếu ai đó thấy điều này đặc biệt hữu ích hoặc tìm mã trước đó bị lỗi thời, tôi có thể "quảng bá" câu trả lời này hoặc bỏ phiếu cho nó. –

+0

Dev hoặc là cách hoạt động, cách tôi làm điều đó chỉ làm cho ý nghĩa hơn để tâm trí đơn giản như tôi! Tôi đã gặp rắc rối với định nghĩa của bạn về singleCR - Tôi gặp lỗi trong IOS5 xCode 4.3.1 – DoctorG

+0

Hehe chắc chắn. Tôi sẽ kiểm tra cả hai giải pháp khi tôi có thời gian và đăng lại. –

1

tôi có thể không có được giải pháp của Scott để làm việc (mặc dù tôi không dành quá nhiều thời gian để thử), nhưng đây là giải pháp đơn giản phù hợp với tôi khi tôi trích xuất văn bản thoát từ tệp xml.

Bên trong chuỗi lớp chức năng của tôi, tôi xác định:

+(NSString)escapeXml:(NSString*)string { 
    return [string stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"]; 
} 
Các vấn đề liên quan