Почему этот вызов NSMutableAttributedString addAttributes аварийно завершает работу? - PullRequest
0 голосов
/ 28 июня 2018

Я получаю частую ошибку при вызове addAttributes в поле, которое не могу воспроизвести (EXC_BREAKPOINT). Добавил проверки NSRange, который я передаю, и, что удивительно, он все еще не работает ... любые идеи с благодарностью приняты!

let boldAttributes : [NSAttributedStringKey: Any] = [.font: cellStyle.boldFont()]
if (nsrange.location >= 0 && nsrange.length > 0 && nsrange.location + nsrange.length <= myAttributedString.length) {
    myAttributedString.addAttributes(boldAttributes, range: nsrange)
}

Журнал аварий добавлен по запросу:

#0. Crashed: com.apple.main-thread
0  MyApp                   0x10054ae38 specialized UIAccessorizedTextField.accessoryAttributedString(IndexPath, cellStyle : UIAccessorizedTextFieldCellStyle) -> NSAttributedString (UIAccessorizedTextField.swift:322)
1  MyApp                   0x10054b104 specialized UIAccessorizedTextField.collectionView(UICollectionView, cellForItemAt : IndexPath) -> UICollectionViewCell (UIAccessorizedTextField.swift:345)
2  MyApp                   0x10054860c @objc UIAccessorizedTextField.collectionView(UICollectionView, cellForItemAt : IndexPath) -> UICollectionViewCell (UIAccessorizedTextField.swift)
3  UIKit                          0x18b229f3c -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:isFocused:notify:] + 356
4  UIKit                          0x18bb90b68 -[UICollectionView _prefetchItemsForVelocity:maxItemsToPrefetch:invalidateCandidatesOnDirectionChanges:] + 508
5  UIKit                          0x18b2088b4 -[UICollectionView layoutSubviews] + 760
6  UIKit                          0x18b0d76f4 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1420
7  QuartzCore                     0x18564dfec -[CALayer layoutSublayers] + 184
8  QuartzCore                     0x18565217c CA::Layer::layout_if_needed(CA::Transaction*) + 324
9  QuartzCore                     0x1855be830 CA::Context::commit_transaction(CA::Transaction*) + 320
10 QuartzCore                     0x1855e6364 CA::Transaction::commit() + 580
11 QuartzCore                     0x1855e71e4 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 92
12 CoreFoundation                 0x18146e910 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
13 CoreFoundation                 0x18146c238 __CFRunLoopDoObservers + 412
14 CoreFoundation                 0x18146c884 __CFRunLoopRun + 1436
15 CoreFoundation                 0x18138cda8 CFRunLoopRunSpecific + 552
16 GraphicsServices               0x183371020 GSEventRunModal + 100
17 UIKit                          0x18b3a9758 UIApplicationMain + 236
18 MyApp                   0x1003f2830 main (main.m:16)
19 libdyld.dylib                  0x180e1dfc0 start + 4

Ответы [ 2 ]

0 голосов
/ 08 июля 2018

Поскольку сбой не может быть легко воспроизведен, он должен зависеть от содержимого myAttributedString или nsrange: окружающий код предоставляет значения, которые проходят ваши проверки, но все равно дают сбой. Я знаю, как этого добиться двумя способами.

Первый - передать NSRange с местоположением NSNotFound и length > 0. Пример:

let myAttributedString = NSMutableAttributedString(string: "Hello")
let nsrange = NSRange(location: NSNotFound, length: 1)

Второй - сбой в старых версиях iOS при добавлении атрибутов в подмножество смайликов. Если вы видите сбой только в старых версиях iOS, это должен быть такой сценарий:

let myAttributedString = NSMutableAttributedString(string: "?‍?‍? is a family")
let nsrange = NSRange(location: 1, length: 2)

Так что, если вы видите сбой для всех версий iOS, вы можете сначала проверить nsrange != NSNotFound, чтобы исправить сбой. Если вы видите сбой только для более старых версий iOS, проверьте окружающий код на наличие мест, где вы могли бы рассчитать неправильный диапазон. Обычно это происходит при смешивании строковой информации из Swift со строковой информацией из Objective-C's Foundation. Например, "?‍?‍?".count равно 1, тогда как ("?‍?‍?" as NSString).length равно 8.

0 голосов
/ 06 июля 2018

Прежде всего необходимо убедиться, что cellStyle.boldFont() возвращает правильное значение. Попробуйте использовать UIFont.boldSystemFont(ofSize: 15), чтобы убедиться, что у вас есть правильное значение в boldAttributes

let boldAttributes : [NSAttributedStringKey: Any] = [.font: UIFont.boldSystemFont(ofSize: 15)]
if (nsrange.location >= 0 && nsrange.length > 0 && nsrange.location + nsrange.length <= myAttributedString.length) {
    myAttributedString.addAttributes(boldAttributes, range: nsrange)
}

После этого дважды проверьте, что myAttributedString является классом NSMutableAttributedString, используя отладчик времени выполнения. Возможно, он неизменен NSAttributedString, и вы пытаетесь добавить к нему свои атрибуты ...

После этого, если у вас все еще есть сбой, необходимо проверить значение nsrange. Может быть, у вас nil или там какое-то неправильное значение

...