«Хэш коммита» в Git имеет более близкое отношение к «индексу» в терминологии базы данных.
«Индекс» в Git имеет совершенно другое значение. Индекс - это разница между последним коммитом и изменениями, которые вы «поставили» для следующего коммита.
Это зависит полностью от того, что Вы хотите сделать.
Кнопка "Show Raw Properties" в Версиях, например, является подклассом NSButton, потому что в основном то, в чем мы нуждались, является поведением стандартной кнопки с нашим собственным взглядом. Один способ разделить кнопку на подклассы состоит в том, чтобы просто реализовать Ваш собственный-drawRect: (NSRect) реагируют метод в подклассе NSButton, но мы решили придерживаться способа, которым NSButton реализован в Какао, означая, что большая часть рисунка сделана ячейкой кнопки, таким образом, реализация похожа на это:
В подклассе NSButton:
+ (Class) cellClass
{
return [OurButtonCell class];
}
- (void)drawRect:(NSRect)rect
{
// first get the cell to draw inside our bounds
// then draw a focus ring if that's appropriate
}
В подклассе NSButtonCell (OurButtonCell):
- (void)drawInteriorWithFrame: (NSRect) rect inView: (NSView *) controlView
{
// a bunch of drawing code
}
Представление Timeline в Версиях является на самом деле веб-представлением, страница, которую Вы видите в нем, использует JavaScript для сворачивания заголовков, на которые Вы нажимаете.
Эмпирическое правило, которое я использую для того, где начать с пользовательским элементом управления:
Рекомендуемое чтение при изучении, как потянуть материал в методах рисования Вашего собственного представления: Руководство Рисования Какао
При настройке вида, например, NSTableView является полностью другой чашкой чая благодаря сложности tableview, который может произойти повсеместно. Вы будете реализовывать свои собственные ячейки для некоторых вещей, которые Вы хотите сделать в таблице, но должны будете изменить способ, которым строки выделяются в подклассе самого фактического объекта NSTableView. Посмотрите, например, исходный код для iTableView на сайте Matt Gemmell для ясного примера того, где потянуть что.
Наконец, я думаю, что предложение Abizer для движения проверяет код BWToolkit, прекрасная идея. Это могло бы быть немного подавляющим сначала, но если можно считать и понять, что кодируют, Вы не испытаете никаких затруднений при реализации собственных представлений и средств управления.
Взгляните на некоторый превосходный пример кода: BWToolkit