Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Отбор записей по скрытому полю - relationship

В таблице Warehouses, Core Data создается поле (FK) - ZCityToWarehouse - это relationship в модели данных, которое не генерируется в классе NSManagedObject.
Мне нужно выбрать записи по этому полю.
На этапе выполнения выдается ошибка: "keypath not found in entity"

Код

  NSEntityDescription *entity = [NSEntityDescription
                                 entityForName:@"Warehouses" inManagedObjectContext:managedObjectContext];
  
  [fetchRequest setEntity:entity];
  
  NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc]
                                      initWithKey:@"whName" ascending:YES];
  NSArray* sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
  
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Warehouses.zcitytowareouse == 133"];
 // ....

Ответ:
В таблице Warehouses, Core Data создается поле (FK) - ZCityToWarehouse - это relationship в модели данных, которое не генерируется в классе NSManagedObject.
Мне нужно выбрать записи по этому полю.
На этапе выполнения выдается ошибка: "keypath not found in entity"

Код

  NSEntityDescription *entity = [NSEntityDescription
                                 entityForName:@"Warehouses" inManagedObjectContext:managedObjectContext];
  
  [fetchRequest setEntity:entity];
  
  NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc]
                                      initWithKey:@"whName" ascending:YES];
  NSArray* sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
  
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Warehouses.zcitytowareouse == 133"];
 // ....

Вопрос: Core Data проверка уникальности записи

Добрый вечер! Вливаюсь в CoreData потихоньку, почти все понятно, кроме вот чего: не могу до конца понять, как работает проверка данных.

Пример: есть таблица (справочник) Colors, в которой одно поле - color (string). Данные в этом поле должны быть уникальны. Во время проектирования модели (xcdatamodel) возможности задать такого свойства нет (пришлось смириться с этим). Ок, тогда создаю класс Colors : NSManagedObject со свойством color, и там же метод
Код Objective-C
1
- (BOOL)validateColor:(id *)color error:(NSError **)outError
. Затем мне надо, вроде бы, просто выполнить запрос, который вернет количество записей с соответствующим color, но меня тут клинит (возможно, надо просто отдохнуть). Правильный ли это подход или это делается как-то по-другому?
Ответ: есть два имеющих вполне одинаковое право на существование подхода
это грубо говоря толстая и тонкая модели

Например в шаблоне Active Record модель сама умеет делать операции присущие DAL (Data Access Layer)
А в шаблоне Repository - вся DAL логика выносится в так званные репозитории и там производятся всякие CRUD операции над моделями, в то время модель это просто объект с полями и, возможно, еще каким-то описанием, не более.

Вы сейчас описываете Active Record, есть крутой фреймворк для реализации CRUD операций над моделями именно таким образом

Просто в Xcode, если вы заново сгенерируете NSManagedObject файл из xcdatamodel, то он просто перезатрет все, что у вас там было еще написано
Потому либо создавайте категорию для модели, либо продвигайтесь по Repository пути и в репозиториях реализовывайте такую логику, либо гляньте такую чудо-тулзовинку и в human-моделях описывайте дополнительную логику

А насчет проверки на уникальность - то да, проверяете или такая запись есть и если есть, то увы
Вопрос: Amazing Flexibility with Nike Free Run 5.0

The almost without shoes think that the  provides is what places it apart from all the other fitness shoes in the market. This Nike 100% free edition is developed with amazing flexible assistance, several surface area keep, and breath-ability everything that you need have fun with the fun of managing everyday and any other training schedule. Collections along the dimension and the length of the midsole enhance relationship and versatility helping you to move you in any path with relaxation. 

Another benefits of the Nike is its no-stitch growth that provides biggest relaxation and litheness. The stuck synthetic content and sleek greater able make a allow air through, compact single-piece top shoes area that provides a comfortable fit. The perforations are logically placed, some large ones and a few small ones, to add to the  shoes' assistance and additional versatility in places that require these aspects.

Order you several now at this and think that compact assistance and the rubber java coffee pods on the rearfoot for that definitely unique comfortable fit and decreased legs pain. The pushes are even formed for additional prepare from behind. More and more people are using the Nike and  for cross-training and a lot described that they work completely even under the most extreme exercise conditions. They are also great for inside activities. In fact, with the Nike design, a lot of sportsmen have noticed that their whole claves and legs are working more which served them to run better with less pain in their legs.

Discover how comfortable the  several is and you will find yourself looking for to put on them all enough time for experiencing of running that is beautiful. Experience the shoes moving your energy directly onto the road and appreciate your run like never before.


Ответ:
The almost without shoes think that the  provides is what places it apart from all the other fitness shoes in the market. This Nike 100% free edition is developed with amazing flexible assistance, several surface area keep, and breath-ability everything that you need have fun with the fun of managing everyday and any other training schedule. Collections along the dimension and the length of the midsole enhance relationship and versatility helping you to move you in any path with relaxation. 

Another benefits of the Nike is its no-stitch growth that provides biggest relaxation and litheness. The stuck synthetic content and sleek greater able make a allow air through, compact single-piece top shoes area that provides a comfortable fit. The perforations are logically placed, some large ones and a few small ones, to add to the  shoes' assistance and additional versatility in places that require these aspects.

Order you several now at this and think that compact assistance and the rubber java coffee pods on the rearfoot for that definitely unique comfortable fit and decreased legs pain. The pushes are even formed for additional prepare from behind. More and more people are using the Nike and  for cross-training and a lot described that they work completely even under the most extreme exercise conditions. They are also great for inside activities. In fact, with the Nike design, a lot of sportsmen have noticed that their whole claves and legs are working more which served them to run better with less pain in their legs.

Discover how comfortable the  several is and you will find yourself looking for to put on them all enough time for experiencing of running that is beautiful. Experience the shoes moving your energy directly onto the road and appreciate your run like never before.


Вопрос: Работа с SQLite из приложения

Здравствуйте! Подскажите как лучше сделать!

Обдумываю создание приложения в котором пользователь при входе выбирает свободное время в этот день и записывается на него ( вносит в БД запись с временем и еще с чем ни будь).

Вот как я думаю сделать:
1. Разбить день на часы и создать соответствующие им таблицы.
2. При входе создается список из пустых таблиц (сканируются все таблицы в которых нет записей)
3. После выбора времени пользователем и после проверки таблицы с соответствующим временем на предмет отсутствия записей , производится запись в таблицу.

Хочу узнать, правильно ли я придумал и как еще можно это сделать? :sample 
Заранее благодарен!
Ответ:
Вы что, каждый день собрались создавать новые таблицы? Это в кррне не правильно. Нужны всего две таблицы - пользователи и заявки (посещения или что там у вас). В таблице Посещения поля Дата, Время и ID пользователя. Этого достаточно чтобы всё сделать. Занятость времени проверяете запросом с указанием текущей даты и нужного времени. Если результат пустой, то можно записывать
Вопрос: Ошибка provisioning profile

Здравствуйте.
Сегодня я попытался освоить публикацию своего первого приложения.
Столкнулся с ошибкой: "No matching provisioning profile found: Your build settings specify a provisioning profile with the UUID"
Весь день бился и никак не выходит.
Подскажите, может кто сталкивался с подобным?

детали:
Лицензия на год оплачена.
Я сделал запрос на сертификат и получил 2 сертификата *.cer для разработки и распространения. (Сохранил, добавил)
Добавил на сайт свой девайс.
Добавил идентификатор своего приложения в AppIDs.
В provisioning profiles добавил 2 профиля: разработчика и распространителя.
Двойным кликом добавил оба в XCode.
В XCode - Настройках аккаунта нажал кнопку загрузки всех файлов профилей.
На сайте скачал "IOS Team..."-профиль и тоже двойным кликом добавил в XCode.
Затем в проекте "Code signing" в 2-х строчках для Дебага проставил профиль разработчика,
и в 2-х строчках для Релиза проставил профиль распространителя.
Ниже, в "provisioning profile" установил "IOS Team..."-профиль.

Compile Clean работает.
Но Архивация и Анализ выдают ошибку:
Code Sign error: No matching provisioning profile found: Your build settings specify a provisioning profile with the UUID “ля-ля-ля”, however, no such provisioning profile was found.

Тут же предлагает исправить.
Результат исправления - обнуление всех полей "Code signing", и успешная компиляция и запуск.
----------------

Пробовал пересоздавать файлы профиля. Не помогает.
Даже сменил "Bundle Identifier" у приложения, и сделал все заново от создания идентификатора в AppIDs.
Не помогает.

Спасите! Помогите!!!

Добавлено через 14 часов 2 минуты
В очередной раз пвторил процедуру описанную выше - заработало.
Так и не понял в чем моя ошибка.
Ответ: ну обычно стоит смотреть в Build Settings -> Code Signing секцию
там есть такие поля, как Code Signing Identity и Provisioning Profile, там и смотрите, чтобы ваш профиль подходил

еще есть одно место, куда стоит смотреть, это в случае если вы состоите в нескольких группах разработчиков, это - таргет проекта -> General -> Team

еще зайдите в Xcode -> Preferences -> Accounts -> ваш акаунт -> выберите вашу команду, кликните дважды и скачайте все провижн профайлы

тяжело просто так сходу сказать, в чем именно проблема
Вопрос: Как вывести запись на стене ВК

Добрый день. Уже умаялся с одной проблемой. Делаю вывод стенки юзера в ВК, уже со многим разобрался и вложения разные и проигрывание аудио, видео и все такое, но с репостами возникли трудности, а именно как их вывести/показать. Хочу сделать что бы первая ячейка (indexPath.row==0) была инфа о самом юзере (тут проблем нет все работает), проблемы дальше, во второй ячейке должен быть текст юзера (если он есть этот текст) если текста нету, то должна быть на этом месте ячейка с инфой откуда юзер этот пост притащил. Если текст есть, то ячейка с инфой о репосте должна быть в indexPath.row==2, потом помимо текста могут быть вложения от юзера, напр картинка, ее тоже до репоста нужно показать (например с 3 по 5) и уже после показа вложений вставлять ячейку с инфой о репосте, правда под каким индексом она будет хз. Потом аналогичная проблема и с внутренним текстом (ну в посте который зарепостили) он может быть, а может не быть. И вот как все это закодить я не представляю, с этими индексами запутался вкрай, даже идей никаких не приходит, разве что все жестко закодить (прописать в ifах все возможные варианты). Делаю для одного варианта все работает, чуть другой тип поста, приложение крашится, если неправильно ифы проставлю то во всех ячейках выполняется только первое условие (напр. проверка есть ли текст от юзера). Может кто подскажет как тут поступить или пример какой то, именно этого места. (делаю без vk sdk на чистом vk api +afNetworking)
Ответ: Вообщем я полукостыльным способом этот вывод сделал

Код Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    VRUniversalTypePost* AllPost = [self.allPostsArray objectAtIndex:indexPath.section];
    startingIndexPath = [self tableCellOffset:AllPost];
    
 
   
   
    
    
    
    if (indexPath.row==0) {
        
        indexCellNumb=0;
        static NSString *CellIdentifier = @"UserCell";
        VRUserCell *cell = [self.tableViewForWallPost dequeueReusableCellWithIdentifier:CellIdentifier];
        
        if (!cell) {
            cell = [[VRUserCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        
        VRUser * userPost = AllPost.fromUser;
        NSLog(@"AllPost.fromUser.lastName = %@", AllPost.fromUser.lastName );
        
        NSString *authorPostID = [NSString stringWithFormat:@"%@ %@", userPost.firstName, userPost.lastName];
        // NSString *srt = [self getPostAuthorFromID: authorPostID];
       
        cell.userNameLabel.text = authorPostID;
        cell.userPhotoImgView.layer.cornerRadius = 25;
        cell.userPhotoImgView.layer.masksToBounds = YES;
        [cell.userPhotoImgView setImageWithURL:userPost.imageURL placeholderImage:[UIImage imageNamed:@"administrator-50.png"]];
        cell.pubDatePostLabel.text = AllPost.postPubDate;
        
        
 
      
        
        return cell;
    }
    
    else  {
        
        
        if (((AllPost.text!=nil)&&(![AllPost.text isEqualToString:@""]))&&(indexPath.row==1)) {
           
                
            
                static NSString *CellIdentifier = @"typePostIsText";
                VRPostCell *cell = [self.tableViewForWallPost dequeueReusableCellWithIdentifier:CellIdentifier];
                
                if (!cell) {
                    cell = [[VRPostCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
                }
                
                cell.postTextLabel.text = AllPost.text;
            
            indexCellNumb++;
                return cell;
            
        }
        
        else  if ((AllPost.attachments!=nil)&&(indexCellNumb<=AllPost.attachments.count)){
            NSLog(@"indexPath.row = %i", indexPath.row);
            NSLog(@"indexCellNumb = %i", indexCellNumb);
            NSInteger countForOffsetTable;
            
            if ((AllPost.text!=nil)&&(![AllPost.text isEqualToString:@""])) {
                countForOffsetTable=1;
            }
            else {
                countForOffsetTable=0;
            }
            
            
                NSArray * attachArray = AllPost.attachments;
                 NSDictionary * attachmentsDict;
              //  for (int i=0; i<attachArray.count; i++) {
                
               
                NSLog(@"attachArray.count = %i", attachArray.count);
            NSLog(@"indexPath.row error = %i", (indexPath.row-(countForOffsetTable+1)) );
           
                
            
                attachmentsDict = attachArray[indexPath.row-(countForOffsetTable+1)];
                indexCellNumb++;
                return [self attachmentViewFromPost:AllPost andAttachmentDict:attachmentsDict];
            
           
                //}
        }
        
        else if ((AllPost.postCopy==YES)&&(indexPath.row==indexCellNumb+1)) {
            
            static NSString *CellIdentifier = @"postCopy";
            VRPostCopyCell *cell = [self.tableViewForWallPost dequeueReusableCellWithIdentifier:CellIdentifier];
            
            if (!cell) {
                cell = [[VRPostCopyCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            }
            
            
            NSString *strID = [NSString stringWithFormat:@"%i", AllPost.postFromUserID];
            cell.postFrom.text = AllPost.fromGroup.groupName;
            
            return cell;
            
        }
        
        else if ((AllPost.postCopy==YES)&&
                 (AllPost.postInside.text!=nil)&&
                 (![AllPost.postInside.text isEqualToString:@""])&&
                 (indexPath.row==indexCellNumb+2)) {
            
            static NSString *CellIdentifier = @"typePostIsText";
            VRPostCell *cell = [self.tableViewForWallPost dequeueReusableCellWithIdentifier:CellIdentifier];
            
            if (!cell) {
                cell = [[VRPostCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            }
            
            cell.postTextLabel.text = AllPost.postInside.text;
            
            return cell;
            
        }
        
        else  if (((AllPost.postCopy==YES))&&(AllPost.postInside.attachments!=nil)){
            
NSInteger strInt = (AllPost.cellForTypeIndex+ AllPost.attachments.count) + AllPost.postInside.cellForTypeIndex;
            
            NSArray * attachArray = AllPost.postInside.attachments;
            
            
            
            NSDictionary * attachmentsDict;
            
            
            NSLog(@"indexPath.row = %i", indexPath.row );
            attachmentsDict = attachArray[indexPath.row-(strInt+1)];
            
            return [self attachmentViewFromPost:AllPost andAttachmentDict:attachmentsDict];
            
            
        }
 
        
        
        
    }
    
    
    
 
 
    return nil;
 
}
При скроле вниз все отображается и работает нормально, но при скролле вверх приложение начинает падать. Проблема в этой переменной indexCellNumb, которая только увеличивается, но при скроле вверх она остается такой же (напр 7) в результате идет обращение к массиву с двумя элементами к объекту под интексом 7. И как результат все приложение падает.
Подскажите как определить что идет скролл вверх, что можно было значение indexCellNumb уменьшать? Если делать без этой переменной, то при выполнении метода cellForRowAtIndexPath будет выполняться только одно условие, например 10 раз выведется один и тот же текст, так как выполнится условие что AllPost.text!=nil (о том что переменные названы ужасно неправильно я понимаю)

Добавлено через 2 часа 58 минут
Или может кто то может подсказать как построить логику без этой переменной indexCellNumb?
Вопрос: Отклонение приложения в AppStore

Добрый день.
Я загружаю свое приложение в AppStore и мне приходит ошибка через два дня:

6 сент. 2017 г. в 17:54
От: Apple
4. 1 Design: Copycats
Guideline 4.1 - Design - Copycats


Your app or its metadata appears to contain misleading content. Specifically, your app includes content that resembles VipGeo without the necessary authorization.

Next Steps

Please demonstrate your relationship with any third-party brand owners represented in your app.
Приложение делал я, но товарный знак не мой. Я работает как фрилансер, а заказчик хочет опубликовать приложение в моем магазине.

Какие решения данной проблемы?
Ответ: Открыть пользовательское соглашение и правила публикации в магазине и следовать им, в крайнем случае обратиться за разъяснениями в поддержку.
Вопрос: Разработчик в команду для работы над приложением

Ребята, привет!

Проект приложения "iPerson" прошел отбор на сервисе краудворкинга AllyBoy. Теперь мы ищем разработчика в команду для совместной работы над проектом. Предполагаемые платформы: iOS, Android.
В случае успешного воплощения идеи получаем инвест продвижение от AllyBoy. Всем кому интересно, приглашаем принять участие в обсуждении.

Кстати, можете делиться идеями и предложениями на странице проекта. За это даем процент в проекте!

Вот ссылка на проект: 

Будем рады найти отличного специалиста и хорошего человека!

(IMG:)
Ответ:
спасибо, чекнем
Вопрос: Использование NSManagedObject's повсеместно в проекте

Привет всем!

Прочитал недавно в статье (жаль не сохранил и не запомнил сайт, кинул бы ссылку) рекомендацию, где автор советовал при работе с CoreData действовать следующим образом:

Например, есть у нас Entity под классическим названием "Person".
Мы создаем наследник NSObject, с такими же самыми полями, назвав его так же, но, например, с каким-то префиксом, или дополнительным окончанием.

И, везде в проекте работаем только с этим наследником NSObject, а, если нам надо сохранить эту сущность в CoreData, то перед сохранением создаем уже саму сущность NSManagedObject, копируем туда все поля и сохранем.
И аналогично действуем при чтении.

Типа, разделяем совсем-совсем слой CoreData и остальную логику приложения.

Я так действовал по наитию, когда делал первые шаги в CoreData, потом отказался от этой идеи, видя, что никто так не делает, а сейчас встретил эту статью и задумался.

Что вы скажете о таком подходе?
Ответ: Скорее всего в статье говорилось о категории. При таком подходе ничего копировать не нужно. Вообще это нормальная практика, избавляет от многих проблем. Например, вы изменили сущность и хотите пересоздать класс, но в старом классе у вас содержатся ваши методы, и придется их перенести, и здесь помогает категория, вы легко пересоздаете класс сущности, а код с методами остается в категории.
Вопрос: Два segue, Два viewController, Одно отображение

Добрый день! Изучаю работу c segue - и столкнулся с проблемой.

Какая стоит передо мной задача. Есть два класса (viewController), один наследуется от другого.
Отображение для них общее.

Мне нужно с главного отображения переходить на следующее отображение, но в зависимости от кнопки, выбирать для этого отображения конкретный класс

Если делать без storyboard - то все просто. Я создаю нужный мне viewController (initWithXibName) указывая свое отображение.

Здесь же я создал 2 segue - оба получается от соответствующих кнопок. Обе ведут на второе отображение. Но ведь в IB класс указан в настройках.

Я использую функцию prepareForSegue, но не пойму как изменить класс для этого отображения.

Это возможно? Хотелось бы использовать одно отображение, чтобы не плодить второе отображение (потому что просто два режима, просмотр записи, и добавление записи) - но хотелось бы два контроллера.

Спасибо!
Ответ: я утрировал) просто не понял Ваш вопрос, о том, зачем нужен еще один уровень наследования.

На самом деле, я изучаю(вспоминаю) objective-c пользуясь книгами (одна из них Head First) - ну так вот там был еще ios5. Я пытаюсь реализовать примеры из книги, но исползуя новые возможности, в данном случае SEGUE.

В книге используется простой прием. initWithXibName. Который позволяет загрузить любой VC с любым отображением. Здесь же так не получается - поэтому у меня появился этот вопрос)

Понятно, что есть другие пути решения, но хочется именно вникнуть, как все работает - и сделать так же как в книге, но другими методами